MDX: создание уровня иерархии в отчете RDL

Допустим, у нас есть куб с измерением «Продуктовый магазин», который имеет 2-х уровневую иерархию:

  • Fruits & Vegetables Dep.
    • Fruits
    • Овощи
    • Помидоры
    • Огурцы
  • Пекарня отд.
  • Молочный отд.

Вопрос в том, как добавить уровень иерархии в mdx-запрос RDL-отчета, чтобы элементы «Помидоры» и «Огурцы» переместились на новый 3-й уровень под родным 2-м уровнем «Овощи». Мне нужно сделать это без каких-либо изменений в Cube, только с помощью чистого mdx.

Когда я попытался построить вычисляемый набор для желаемого 3-го уровня и использовать его вместе с остальной частью исходной иерархии следующим образом:

 WITH SET [Level 3] AS 
    case 
    when [Grocery store].[Hierarchy].[Level 2].CURRENTMEMBER = [Grocery store].[Hierarchy].&[Tomatoes] OR
         [Grocery store].[Hierarchy].[Level 2].CURRENTMEMBER = [Grocery store].[Hierarchy].&[Cucumbers]
    then [Grocery store].[Hierarchy].[Level 2].CURRENTMEMBER
    else null end

SELECT {[Measures].[Sales]} ON COLUMNS,

CrossJoin(Hierarchize( {[Grocery store].[Hierarchy].[Level 2]}
                      -{[Grocery store].[Hierarchy].&[Tomatoes],
                        [Grocery store].[Hierarchy].&[Cucumbers]}),
          [Level 3]) ON ROWS 

FROM [CUBE]

Я столкнулся с ошибкой, говорящей о том, что функция перекрестного соединения не может принимать одно и то же измерение «Продуктовый магазин» два раза.


person Globe    schedule 01.06.2015    source источник
comment
Ваша цель - скрестить двух участников, Тома и Кука, с участниками Level2? Если это то, чего вы хотите достичь, вы можете создать пользовательские элементы в другом измерении, которые равны Тому и Куку, а затем перекрестно соединить эти новые пользовательские элементы с уровнем 2 .... но если вы хотите создать новый уровень в сценарий MDX, то это невозможно.   -  person whytheq    schedule 01.06.2015


Ответы (1)


Создание нового уровня на лету невозможно.

Некрасиво, но один из способов обойти это — создать пару новых вычисляемых элементов в каком-то несвязанном измерении, а затем выполнить перекрестное соединение со вторым уровнем.

WITH 
  MEMBER [Geography].[Tomatoes] AS ([Geography].[All],[Grocery store].[Hierarchy].&[Tomatoes])
  MEMBER [Geography].[Cucumbers] AS ([Geography].[All],[Grocery store].[Hierarchy].&[Cucumbers])
  SET [Level 3] AS 
    {
      [Geography].[Tomatoes],
      [Geography].[Cucumbers]
    }    
SELECT 
  {[Measures].[Sales]} ON COLUMNS,
  CrossJoin(
     Hierarchize( 
       {[Grocery store].[Hierarchy].[Level 2]}
       {[Grocery store].[Hierarchy].&[Tomatoes],
        [Grocery store].[Hierarchy].&[Cucumbers]}
      )
     ,[Level 3]
   ) ON ROWS 
FROM [CUBE]
person whytheq    schedule 01.06.2015
comment
Это интересная идея. Я попробовал ваш код. Вычисляемые элементы Tom & Cuc в несвязанном измерении создаются успешно, как и вычисляемый набор [Уровень 3], но окончательное перекрестное соединение этой иерархии [Уровень 3] с кубом [Уровень 2] возвращает ноль строк. Я чувствую, что ваше предложение действительно то, что я искал, и сейчас я очень близок к решению. Я продолжу копать код и выложу сюда результат, если он будет - person Globe; 03.06.2015
comment
после нескольких попыток заполнить пустые ячейки данными - я сдался и оставил исходную иерархию в своем отчете, просто сделал жирным шрифт для фруктов и овощей - в сетке rdl. Тем не менее я считаю, что @whytheq дал мне правильное направление для дальнейших попыток - person Globe; 22.06.2015
comment
Я продолжил изучение вычисляемых элементов в наборах в связанном потоке MDX: создайте 2 элемента «старые клиенты» и «новые клиенты» и покажите для них статистику продаж (stackoverflow .com/questions/31436277/). @whytheq, было бы здорово, если бы ты посмотрел на это - person Globe; 15.07.2015