Поиск среднего значения для нескольких иерархий измерений даты

У меня есть куб, и внутри этого куба есть измерение даты, которое имеет следующие атрибуты

Календарный год, календарный месяц-год, финансовый год, финансовый год-квартал, дата

Теперь с этими атрибутами у меня есть две пользовательские иерархии, они выглядят следующим образом: Иерархия календаря, в которой есть календарный год, календарный месяц-год, дата.

Вторая определяемая пользователем иерархия - это Финансовая иерархия, которая включает финансовый год, финансовый год-квартал, календарный месяц, год и дату.

Я хочу знать средние продажи, поэтому я создал меру, которая

Member [Measures].[Sales Daily Avg]
AS Avg ( Descendants ( [Date].[Calendar].CURRENTMEMBER, [Date].[Calendar].[Date] ), CoalesceEmpty([Measures].[Total Sales] , 0) )  

Это отлично работает при запуске чего-то вроде

SELECT {
[Measures].[Sales Daily Avg],
} ON COLUMNS,
{ [Date].[Calendar].[Calendar Year].Members } ON ROWS
FROM 
[SalesCube]

Это будет работать, если я использую [Дата]. [Календарь]. [Календарный месяц-год]. Участники, но он не будет работать с атрибутами моей финансовой иерархии, за исключением календарного месяца-года. Как я могу изменить свою меру, чтобы она принимала атрибуты иерархии финансового года.

Я пробовал перекрестное объединение по финансовому году, потому что, если набор пуст, он просто оценит тот, который используется. Но у меня это просто не работает (я предполагаю, что проблема в sytnax).

Извините, ребята, я новичок в этом.


person Dungkin    schedule 29.10.2015    source источник


Ответы (1)


Измените определение вычисляемого члена на:

CREATE Member [Measures].[Sales Daily Avg]
AS 
IIF
  (
   NOT([Date].[Fiscal].CURRENTMEMBER IS [Date].[Fiscal].[All])
   ,
   Avg 
     ( 
      Descendants 
                (
                 [Date].[Fiscal].CURRENTMEMBER, 
                 [Date].[Fiscal].[Date] 
                )
     ,
     CoalesceEmpty([Measures].[Total Sales] , 0) 
    )
   ,
   IIF
     (
      NOT([Date].[Calendar].CURRENTMEMBER IS [Date].[Calendar].[All])
      ,
      Avg 
        ( 
         Descendants 
                (
                 [Date].[Calendar].CURRENTMEMBER, 
                 [Date].[Calendar].[Date] 
                )
        ,
        CoalesceEmpty([Measures].[Total Sales] , 0)
        ),
        NULL //Change this to whatever you want in case none of the hierarchies 'Calendar' or 'Fiscal' is involved.
     )
     )

По сути, это сначала проверяет, входит ли какой-либо член из «финансовой» иерархии в область действия или нет. Если это так, оно будет усреднено по финансовым датам для выбранного члена. Если первое условие не выполняется, он дополнительно проверяет, входит ли в область действия какой-либо член иерархии «Календарь». Если это так, это работает аналогично с иерархией «Календарь». Наконец, если ни один из членов иерархии не попадает в область видимости, это дает NULL (вы можете переосмыслить и поставить в соответствии с вашими требованиями).

ПРИМЕЧАНИЕ: когда currentmember любой иерархии является членом All, это означает, что иерархия не входит в область видимости (не является частью среза или осей)

person SouravA    schedule 30.10.2015
comment
Я получаю # Ошибка. Ваши условия выглядят так, как будто они работают отлично, но когда дело доходит до выполнения функций AVG, кажется, что-то не работает. Я тестировал функцию avg вне функции IFF, и они работают весело, как только они попадают в свои, выдает ошибку #Error. - person Dungkin; 30.10.2015
comment
Это может быть что угодно, от опечатки до стандартной синтаксической ошибки. Я еще не тестировал. Разрешите. - person SouravA; 30.10.2015
comment
Работает отлично. Большое спасибо. Мало того, что ваш код был правильным, ваше объяснение было очень познавательным. MDX сложно изучать. - person Dungkin; 30.10.2015
comment
эта мера работает, если у нас есть [Date].[Calendar].MEMBERS НА РЯДАХ? - person whytheq; 02.11.2015
comment
@SouravA +1 за ваш ответ. Единственная проблема заключается в том, что когда вы выбираете более одного члена в фильтре (скажем, два календарных года), Excel отправляет их во вложенном запросе (вложенном кубе), и SSAS не будет знать, что используется календарный год, вызывая его вернуть null. - person BICube; 17.06.2016