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。
示例
以下示例从 Adventure Works 多维数据集中返回 [Sales Territory].[Northwest] 成员的分销商订单计数以及该成员的所有祖先。Order 函数将对包含 [Sales Territory].[Northwest] 成员及其在 ROWS 轴上的祖先的集重新排序。Order 函数按 [Sales Territory] 层次结构所确定的层次结构顺序从最顶层成员到最底层成员对该集进行排序。
SELECT
Measures.[Reseller Order Count] ON COLUMNS,
Order(
Ascendants(
[Sales Territory].[Sales Territory].[Northwest]
),
DESC
) ON ROWS
FROM
[Adventure Works]
下面的示例根据 Reseller Gross Profit 返回产品的前五大销售子类别的 Reseller Sales Measure(与层次结构无关)。Subset 函数用于在使用 Order 函数对结果进行排序之后,仅返回集中的前五个元组。
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]
下面的示例返回集中唯一的产品的数目,同时在使用 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]