秩序(MDX)

排列指定集合的成員,可選擇保留或中斷階層結構。

Syntax

  
Numeric expression syntax  
Order(Set_Expression, Numeric_Expression   
[ , { ASC | DESC | BASC | BDESC } ] )  
  
String expression syntax  
Order(Set_Expression, String_Expression   
[ , { ASC | DESC | BASC | BDESC } ] )  
  

論點

Set_Expression
一個有效的多維表達式(MDX)表達式,能回傳一個集合。

Numeric_Expression
一個有效的數值表達式,通常是多維表達式(MDX)的儲存格座標表達式,回傳一個數字。

String_Expression
一個有效的字串表達式,通常是有效的多維表達式(MDX)表達式,該表達式包含以字串表示的儲存格座標。

備註

Order 功能可以是階層式(如使用 ASC 或 DESC 標誌所指定)或非階層式(如使用 BASC 或 BDESC 旗標所指定;B 代表「中斷層級」。 若指定為 ASC 或 DESC,Order 功能會先依成員在階層中的位置排列,然後對每個層級進行排序。 若指定為 BASC 或 BDESC,Order 函數會依階層順序排列集合中的成員。 在沒有任何旗幟指定的情況下, ASC 是預設的。

若使用 Order 函數,且該集合有兩個或以上階層交叉連接,且使用 DESC 旗標,則僅排序該集合中最後一個階層的成員。 這與 Analysis Services 2000 不同,當時 2000 集合中所有階層皆有序排列。

Examples

以下範例從 Adventure Works 立方體中回傳日期維度曆曆階層中所有 Calendar 季度的轉售訂單數。 Order 函數會重新排序 ROWS 軸的集合。 Order 函數依階層決定[Calendar]的階層順序對集合[Reseller Order Count]進行排序。

SELECT
  Measures.[Reseller Order Count] ON COLUMNS,
  Order(
    [Date].[Calendar].[Calendar Quarter].MEMBERS,
    Measures.[Reseller Order Count],
    DESC
  ) ON ROWS
FROM [Adventure Works]

請注意此例中,當 DESC 旗標改為 BDESC 時,階層結構被打破,日曆季度清單會被回傳,且不顧階層:

SELECT
  Measures.[Reseller Order Count] ON COLUMNS,
  Order (
    [Date].[Calendar].[Calendar Quarter].MEMBERS,
    Measures.[Reseller Order Count],
    BDESC
  ) ON ROWS
FROM [Adventure Works]

以下範例回傳了基於經銷商毛利的前五大銷售子類別的經銷商銷售指標,不論層級結構。 子集函數用於在結果排序後,僅回傳集合中的前五個元組。

SELECT Subset
  (
    Order
      (
        [Product].[Product Categories].[SubCategory].members,
        [Measures].[Reseller Gross Profit], 
        BDESC
      ), 0, 5
  ) ON 0
FROM [Adventure Works]

以下範例使用 排名 函數,根據經銷商銷售金額指標對城市階層成員進行排名,並依序顯示。 透過使用 Order 函數先排序城市階層成員集合,排序只需一次,接著進行線性掃描,最後以排序順序呈現。

WITH   
SET OrderedCities AS Order  
   ([Geography].[City].[City].members  
   , [Measures].[Reseller Sales Amount], BDESC  
   )  
MEMBER [Measures].[City Rank] AS Rank  
   ([Geography].[City].CurrentMember, OrderedCities)  
SELECT {[Measures].[City Rank],[Measures].[Reseller Sales Amount]}  ON 0   
,Order  
   ([Geography].[City].[City].MEMBERS  
   ,[City Rank], ASC)  
    ON 1  
FROM [Adventure Works]  

以下範例會回傳集合中唯一唯一的乘積數量,使用 順序 函數先對非空元組排序,再使用 濾波 器函數。 CurrentOrdinal 函數用於比較並消除平局。

WITH MEMBER [Measures].[PrdTies] AS Count  
   (Filter  
      (Order  
        (NonEmpty  
          ([Product].[Product].[Product].Members  
          , {[Measures].[Reseller Order Quantity]}  
          )  
       , [Measures].[Reseller Order Quantity]  
       , BDESC  
       ) AS OrdPrds  
    , (OrdPrds.CurrentOrdinal < OrdPrds.Count   
       AND [Measures].[Reseller Order Quantity] =   
          ( [Measures].[Reseller Order Quantity]  
            , OrdPrds.Item  
               (OrdPrds.CurrentOrdinal  
               )  
            )  
         )  
         OR (OrdPrds.CurrentOrdinal > 1   
            AND [Measures].[Reseller Order Quantity] =   
               ([Measures].[Reseller Order Quantity]  
               , OrdPrds.Item  
                  (OrdPrds.CurrentOrdinal-2)  
                )  
             )  
          )  
       )  
SELECT {[Measures].[PrdTies]} ON 0  
FROM [Adventure Works]  

要理解 DESC 旗標如何處理元組集合,首先考慮以下查詢的結果:

  
SELECT  
{[Measures].[Tax Amount]} ON 0,  
ORDER(  
[Sales Territory].[Sales Territory].[Group].MEMBERS  
,[Measures].[Tax Amount], DESC)  
ON 1  
FROM [Adventure Works]  
  

在列軸上,你可以看到銷售區域群組依稅額由低排序,分別為:北美、歐洲、太平洋、北美。 現在看看如果我們將銷售區域群組集合與產品子類別集合交叉連接,並以相同方式套用 訂單 函數,會發生什麼事,如下:

  
SELECT  
{[Measures].[Tax Amount]} ON 0,  
ORDER(  
[Sales Territory].[Sales Territory].[Group].MEMBERS  
*  
{[Product].[Product Categories].[subCategory].Members}  
,[Measures].[Tax Amount], DESC)  
ON 1  
FROM [Adventure Works]  
  

雖然產品子類別的集合依遞減、階層式排序,但銷售區域群組現在不再排序,而是依照階層中出現的順序排列:歐洲、北美、北美和太平洋。 這是因為只有元組集合中的最後一個階層,也就是產品子類別,才會被排序。 要重現 Analysis Services 2000 的行為,可以使用一系列巢狀 的 Generate 函式,在每個集合交叉連接前先排序,例如:

  
SELECT  
{[Measures].[Tax Amount]} ON 0,  
GENERATE(  
ORDER(  
[Sales Territory].[Sales Territory].[Group].MEMBERS  
,[Measures].[Tax Amount], DESC)  
,  
ORDER(  
[Sales Territory].[Sales Territory].CURRENTMEMBER  
*  
{[Product].[Product Categories].[subCategory].Members}  
,[Measures].[Tax Amount], DESC))  
ON 1  
FROM [Adventure Works]