WHERE внутри вычисляемой меры? (MDX/OLAP)?

Создаю куб в SQL Server Analysis Services; возникла следующая проблема.


Есть измерение D и мера M, связанные как многие-ко-многим (что важно).

Мне нужно задать вычисляемую меру по формуле M/Σ(M), где Σ — сумма всех фактов меры, ассоциированных хотя бы с одним из членов текущего измерения. Например, общая сумма по мере M у меня около 3 000 000, в то время как следующий запрос возвращает около 120 000:

SELECT [Measures].[M] ON 0
FROM [MyCube]
WHERE [D].[All].CHILDREN


Как видно из примера, вычислять правильную сумму отдельно я научился — всего-то и нужно взять не весь куб, а его слайс, ограниченный всеми членами измерения.


Но вот как вычислить эту сумму внутри вычисляемой меры? Вот упрощённый пример запроса, который, как я думал, будет работать:

CREATE MEMBER [Measures].[Calc] AS
  [Measures].[M] / ( DRILLUPLEVEL( AXIS( 1 ).ITEM( 0 ).HIERARCHY.MEMBERS ).ITEM( 0 ), [Measures].[M] )
  WHERE DRILLUPLEVEL( AXIS( 1 ).ITEM( 0 ).HIERARCHY.MEMBERS ).ITEM( 0 ).CHILDREN


Но, конечно же, MDX не позволяет использовать WHERE в объявлении MEMBER'а.


Подскажите, пожалуйста, есть ли другие способы ограничения слайса для вычисляемой меры?
  • Вопрос задан
  • 4724 просмотра
Решения вопроса 1
Shedal
@Shedal Автор вопроса
В итоге я пришёл к следующему универсальному решению:

CREATE HIDDEN [Total M] =
  AGGREGATE(
    DESCENDANTS(
      AXIS( 1 ).ITEM( 0 ).DIMENSION.LEVELS( 0 ).ITEM( 0 ),
      AXIS( 1 ).ITEM( 0 ).DIMENSION.LEVELS.COUNT
    ) - AXIS( 1 ).ITEM( 0 ).DIMENSION.LEVELS( 0 ).ITEM( 0 ),
    [Measures].[M]
  );

Вкратце — из множества членов нашего измерения вычитаем корневой член, и по оставшемуся множеству аггрегируем нашу меру.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы