訂單 (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 傳回 Date 維度上 [行事曆] 階層中所有 Calendar Quarters 的轉銷商訂單數目。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 時 ,階層會中斷,而且不會考慮階層而傳回 Calendar Quarters 清單:
SELECT
Measures.[Reseller Order Count] ON COLUMNS,
Order (
[Date].[Calendar].[Calendar Quarter].MEMBERS,
Measures.[Reseller Order Count],
BDESC
) ON ROWS
FROM [Adventure Works]
下列範例會根據轉銷商總利潤,傳回產品前五個銷售子類別的轉銷商銷售量值,而不論階層為何。 在使用 Order 函式排序 結果之後,子集 函式只會傳回集合中的前 5 個 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 函式在使用 Filter 函式之前排序非空白 Tuple。 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]
在 [資料列] 軸上,您可以看到銷售領域群組已依稅額遞減順序排序,如下所示:北美洲、歐洲、太平洋、NA。 現在,如果我們將一組 Sales Territory Groups 與一組產品子類別交叉,並以相同的方式套用 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]
雖然 Product Subcategories 集合已依遞減、階層順序排序,但銷售領域群組現在不會依階層的順序排序並出現:歐洲、NA、北美和太平洋。 這是因為只會排序元組 Product Subcategories 集合中的最後一個階層。 若要重現 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]