Проблема с функцией заказа и кросс-монетами в многомерных выражениях

У нас есть таблица с одной мерой [Размер скидки] в столбцах и CROSSJOIN [Продукт]. [Категории продуктов] и [География]. [География] на оси ROWS.

Мы используем функцию ORDER для сортировки объектов по [Размер скидки] с опцией «BDESC».

Многомерные выражения:

SELECT 
  NON EMPTY 
    {[Measures].[Discount Amount]} ON COLUMNS
 ,NON EMPTY 
    Order
    (
      {
        Hierarchize
        (
          {
            CrossJoin
            (
              {
                Hierarchize
                (
                  {
                    [Product].[Product Categories].[All Products]
                   ,[Product].[Product Categories].[All Products].Children
                  }
                )
              }
             ,{Hierarchize({[Geography].[Geography].[All Geographies]})}
            )
          }
        )
      }
     ,[Measures].[Discount Amount]
     ,BDESC
    ) ON ROWS
FROM [Adventure Works];

Таблица выглядит хорошо и отображает информацию так, как мы этого хотим.

Затем мы хотим развернуть элемент [Все категории] для сущности [Одежда]. Для этого нам нужно внести несколько изменений:

  • изменить существующий Crossjoin (как и раньше, но без одежды);
  • добавить новое перекрестное соединение для сущности [Одежда] с расширением выбранного элемента [Все категории];

новый MDX:

SELECT 
  NON EMPTY 
    {[Measures].[Discount Amount]} ON COLUMNS
 ,NON EMPTY 
    {
      Order
      (
        {
          Hierarchize
          (
            {
              CrossJoin
              (
                {
                  Except
                  (
                    {
                      Hierarchize
                      (
                        {
                          [Product].[Product Categories].[All Products]
                         ,[Product].[Product Categories].[All Products].Children
                        }
                      )
                    }
                   ,{[Product].[Product Categories].[Category].&[3]}
                  )
                }
               ,{Hierarchize({[Geography].[Geography].[All Geographies]})}
              )
            }
          )
         ,CrossJoin
          (
            {[Product].[Product Categories].[Category].&[3]}
           ,{
              Hierarchize
              (
                {
                  [Geography].[Geography].[All Geographies]
                 ,[Geography].[Geography].[All Geographies].Children
                }
              )
            }
          )
        }
       ,[Measures].[Discount Amount]
       ,BDESC
      )
    } ON ROWS
FROM [Adventure Works];

и таблица результатов в SQL Server Management Studio: Таблица с сортировкой BDESC

Как вы можете видеть, все дочерние элементы сущности [Clothing] теряют свою иерархию и отображаются как отдельные сущности в таблице.

Но мы хотим, чтобы эти элементы находились в разделе [Все регионы] [Одежда].

Если мы попытаемся изменить тип сортировки на «DESC» (иерархический), дочерние элементы будут отображаться правильно, но упорядочение в таблице не работает:

Таблица с сортировкой DESC

Поэтому мы ищем решение, как в таких таблицах делать упорядочивание и разворачивание работ.

Спасибо.


person Vlad Alekseev    schedule 19.02.2015    source источник
comment
Если вы не привязаны только к mdx, используйте openquery в sql, чтобы получить необработанный набор через mdx и отсортировать его по sql Order BY   -  person George    schedule 19.02.2015
comment
@George - похоже, они должны быть привязаны к какому-то инструменту MDX, поскольку, конечно же, никто не стал бы сознательно бросать все эти hierarchize ?!   -  person whytheq    schedule 20.02.2015


Ответы (1)


Вот и все - я извлек много ваших экземпляров Hierarchize, чтобы попытаться увидеть лес за деревьями. Вместо того, чтобы просто использовать меру для заказа, я использовал кортеж с добавлением [Product].[Product Categories].[Product Categories]:

SELECT 
  NON EMPTY 
    {[Measures].[Discount Amount]} ON COLUMNS
 ,NON EMPTY 
    {
      Order
      (
        {
            Except
            (
              {
                [Product].[Product Categories].[All Products]
               ,[Product].[Product Categories].[All Products].Children
              }
             ,[Product].[Product Categories].[Category].&[3]
            )
          * 
            [Geography].[Geography].[All Geographies]
         ,
            [Product].[Product Categories].[Category].&[3]
          * 
            {
              [Geography].[Geography].[All Geographies]
             ,[Geography].[Geography].[All Geographies].Children
            }
        }
       ,([Measures].[Discount Amount],[Product].[Product Categories].[Product Categories])
       ,BDESC
      )
    } ON ROWS
FROM [Adventure Works];
person whytheq    schedule 20.02.2015