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 多维数据集返回 Date 维度上 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]
以下示例根据 Reseller Gross Profit(分销商毛利润),返回前五个销售产品子类别的分销商销售额度量值,而不管层次结构如何。 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]
为了理解 DESC 标志是如何使用元组集的,请首先考虑以下查询的结果:
SELECT
{[Measures].[Tax Amount]} ON 0,
ORDER(
[Sales Territory].[Sales Territory].[Group].MEMBERS
,[Measures].[Tax Amount], DESC)
ON 1
FROM [Adventure Works]
在行轴上,您可以看到 Sales Territory Groups 已按 Tax Amount 的降序排序,如下所示:North America、Europe、Pacific、NA。 现在,看一下如果将 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 现在未排序并且以它们在层次结构上出现的顺序出现:Europe、NA、North America 和 Pacific。 其原因在于,仅对元组集合中最后一个层次结构 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]