Порядок (MDX)

Организует элементы определённого множества, при этом по желанию сохраняется или нарушает иерархию.

Syntax

  
Numeric expression syntax  
Order(Set_Expression, Numeric_Expression   
[ , { ASC | DESC | BASC | BDESC } ] )  
  
String expression syntax  
Order(Set_Expression, String_Expression   
[ , { ASC | DESC | BASC | BDESC } ] )  
  

Arguments

Set_Expression
Допустимое выражение многомерных выражений (MDX), которое возвращает множество.

Numeric_Expression
Допустимое числовое выражение, которое обычно является многомерным выражением (MDX) координат ячеек, возвращающих число.

String_Expression
Допустимое строковое выражение, которое обычно является допустимым выражением многомерных выражений (MDX) координат ячеек, возвращающих число, выраженное в виде строки.

Remarks

Функция Order может быть иерархической (как указано с помощью флага ASC или DSC) или неиерархической (как указано с помощью флага BASC или BDESC; буква B означает «break hierarchy» (иерархия разрыва). Если указаны ASC или DESC , функция Order сначала расставляет членов в соответствии с их положением в иерархии, а затем упорядочивает каждый уровень. Если указаны BASC или BDESC , функция порядка располагает элементы множества без учёта иерархии. Если флаг не указан, ASC является по умолчанию.

Если функция Order используется с множеством, где перекрёстно соединяются две или более иерархии, и используется флаг DSC , то упорядочивают только члены последней иерархии в наборе. Это изменение по сравнению с Analysis Services 2000, где все иерархии в наборе были упорядочены.

Примеры

Следующий пример возвращает из куба Adventure Works количество заказов реселлеров для всех календарных кварталов из календарной иерархии по измерению даты. Функция порядка перестраивает множество для оси ROWS. Функция порядка упорядочивает множество по [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, иерархия нарушается, и список календарных кварталов возвращается без учёта иерархии:

SELECT
  Measures.[Reseller Order Count] ON COLUMNS,
  Order (
    [Date].[Calendar].[Calendar Quarter].MEMBERS,
    Measures.[Reseller Order Count],
    BDESC
  ) ON ROWS
FROM [Adventure Works]

Следующий пример возвращает показатель продаж реселлеров для пяти самых продаваемых подкатегорий товаров, независимо от иерархии, на основе валовой прибыли реселлеров. Функция подмножества используется для возврата только первых 5 кортежей множества после упорядочения результата с помощью функции порядка .

SELECT Subset
  (
    Order
      (
        [Product].[Product Categories].[SubCategory].members,
        [Measures].[Reseller Gross Profit], 
        BDESC
      ), 0, 5
  ) ON 0
FROM [Adventure Works]

В следующем примере используется функция Rank для ранжирования членов городской иерархии на основе показателя суммы продаж от реселлеров, а затем отображается в ранжовом порядке. Используя функцию Order для первого упорядочения множества членов иерархии городов, сортировка проводится только один раз, затем следует линейное сканирование перед представлением в порядке отсортов.

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 . Функция 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 расположены в убывающем порядке по сумме налога: Северная Америка, Европа, Тихоокеанский регион, Северная Америка. Теперь посмотрите, что произойдёт, если объединить множество групп территорий продаж с набором подкатегорий товаров и применить функцию 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]  
  

Хотя набор подкатегорий товаров был упорядочен в убывающем, иерархическом порядке, группы территорий продаж теперь не отсортированы и отображаются в том порядке, в каком они появляются в иерархии: Европа, Северная Америка, Северная Америка и Тихоокеанский регион. Это связано с тем, что сортируется только последняя иерархия в наборе кортежей — подкатегории произведений. Чтобы воспроизвести поведение 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]