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 は、階層を "解除" するという意味の "break" の "b" です)。ASC または DESC を指定した場合、階層内の位置に基づいてメンバーが整列され、その後で各レベルが整列されます。BASC または BDESC を指定した場合は、階層を無視してセット内のメンバーが整列されます。どのフラグも指定しない場合は、既定値の ASC が使用されます。
複数の階層がクロス結合されるセットと共に Order 関数が使用され、DESC フラグが使用される場合、セットの最後の階層のメンバーのみが並べ替えられます。この点が Analysis Services 2000 とは異なります。Analysis Services 2000 では、セットのすべての階層が並べ替えられます。
例
次の例では、Adventure Works キューブについて、Date ディメンションの Calendar 階層からすべての Calendar Quarters の再販業者の注文数を返しています。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 に変更されると、階層が壊れ、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]
次の例では、階層とは無関係に、Reseller Gross Profit に基づいて、売上が上位 5 番目までの製品のサブカテゴリに対応する Reseller Sales メジャーを返しています。Subset 関数は、Order 関数を使用して結果を並べ替えてから、セット内の先頭から 5 つの組のみを返すために使用されています。
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 階層のメンバーのセットに対して順序付けを行うことにより、並べ替えが 1 度だけ行われます。その後で線形スキャンが行われ、並べ替えた順での表示が行われます。
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]
次の例では、Filter 関数を使用する前に Order 関数を使用して空ではない組を順序付けることで、セット内の一意な製品の数を返しています。順序を比較して同位のものを除去するために、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]
ROWS 軸では、Sales Territory Groups が 北米、ヨーロッパ、太平洋、NA のように Tax Amount の降順に並べ替えられます。次に、Sales Territory Groups のセットを Product Subcategories のセットとクロス結合して、同様に 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 のセットは階層順 (降順) に並べ替えられますが、Sales Territory Groups の並べ替えは行われず、ヨーロッパ、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]