Order (MDX)
安排指定集合的成員,可以選擇保留或者打破階層架構。
語法
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,其集合內的所有階層都會排序。
範例
下列範例會從 Adventure Works Cube 傳回日期維度之日曆階層所有日曆季的零售商訂單數目。Order 函數會重新排列 ROWS 軸的集合。Order 函數依 [Reseller Order Count] 的遞減階層順序 (由 [Calendar] 階層所決定) 來排序集合。
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]
下列範例不考慮階層,而根據 Reseller Gross Profit 傳回前五名產品銷售子類別的 Reseller Sales 量值。在使用 Order 函數排序結果之後,會使用 Subset 函數來傳回集合中的前五個 tuple。
SELECT Subset
(Order
([Product].[Product Categories].[SubCategory].members
,[Measures].[Reseller Gross Profit]
,BDESC
)
,0
,5
) ON 0
FROM [Adventure Works]
下列範例使用 Rank 函數,根據 Reseller Sales Amount 量值來指定 City 階層的成員次序,然後依此次序顯示成員。藉由使用 Order 函數,先排序 City 階層的成員集合,排序只進行一次,接著執行線性掃描,然後再依排序順序呈現。
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]
下列範例會傳回集合中唯一的產品數目,並且先使用 Order 函數來排序非空的 Tuple,再利用 Filter 函數。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 旗標與 Tuple 集合的使用方式,請先考慮下列查詢的結果:
SELECT
{[Measures].[Tax Amount]} ON 0,
ORDER(
[Sales Territory].[Sales Territory].[Group].MEMBERS
,[Measures].[Tax Amount], DESC)
ON 1
FROM [Adventure Works]
在 Rows 軸上,您可以看到銷售領域群組已經依稅額的遞減次序排序,如下:北美、歐洲、太平洋、NA。現在如果我們將銷售領域群組的集合與產品子類別目錄的集合交叉聯結,並且以相同方式套用 Order 函數 (如下所示),檢查會發生何種狀況:
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]
雖然產品子類別目錄的集合已經依遞減階層次序排序,但現在銷售領域群組並未排序,而是以它們在階層中的順序出現:歐洲、NA、北美和太平洋。這是因為只有 Tuple 集合中的最後一個階層 (即產品子類別目錄) 才會排序。若要重現 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]