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 返回产品的前五大销售子类别的 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]

为了理解 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]

请参阅

参考