Поделиться через


Order (многомерные выражения)

Упорядочивает элементы указанного набора, по выбору сохраняя или нарушая иерархию.

Синтаксис

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
    Допустимое многомерное выражение, возвращающее набор.

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

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

Замечания

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

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

Примеры

В следующем примере из куба Adventure Works возвращается число заказов посредников для всех календарных кварталов из иерархии Calendar измерения Date.Функция Order выполняет пересортировку набора по оси строк. Функция 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, иерархия нарушается и список календарных кварталов возвращается без учета этой иерархии.

SELECT

Measures.[Reseller Order Count] ON COLUMNS,

Order(

[Date].[Calendar].[Calendar Quarter].MEMBERS

,Measures.[Reseller Order Count]

,BDESC

) ON ROWS

FROM [Adventure Works]

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

SELECT Subset

(Order

([Product].[Product Categories].[SubCategory].members

,[Measures].[Reseller Gross Profit]

,BDESC

)

,0

,5

) ON 0

FROM [Adventure Works]

В следующем примере функция Rank используется для упорядочивания элементов иерархии City по мере Reseller Sales Amount. Благодаря использованию функции 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]

В следующем примере возвращается количество товаров в уникальном наборе, с помощью функции 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]

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