Определение вычисляемого члена в многомерных выражениях путем фильтрации значения показателя.

Мне нужно определить вычисляемый элемент в MDX (это SAS OLAP, но я был бы признателен за ответы от людей, которые в любом случае работают с различными реализациями OLAP).

Значение новой меры должно быть рассчитано на основе существующей меры путем применения дополнительного условия фильтрации. Думаю будет понятнее на примере:

  • Существующий показатель: "Общий трафик"
  • Существующий размер: «Направление» («Внутри» или «Вне»)
  • Мне нужно создать вычисляемый член "Входящий трафик", который равен "Общий трафик" с дополнительным фильтром (Направление = "В")

Проблема в том, что я не знаю MDX и у меня очень плотный график (извините за вопрос новичка). Лучшее, что я мог придумать, это:

([Measures].[Total traffic], [Direction].[(All)].[In])

Что почти работает, за исключением ячеек с определенным направлением:

пример

Таким образом, похоже, что «внутренний» фильтр в Direction переопределен моим собственным фильтром). Мне нужно пересечение "внутреннего" фильтра и моего собственного. Я интуитивно чувствовал, что это связано с Intersecting [Direction].[(All)].[In] с внутренними координатами оцениваемой ячейки, но трудно понять, что мне нужно, не прочитав сначала по этому вопросу :)

[update] В итоге я получил

IIF([Direction].currentMember = [Direction].[(All)].[Out],
    0,
    ([Measures].[Total traffic], [Direction].[(All)].[In])
)

... но, по крайней мере, в SAS OLAP это приводит к выполнению дополнительных запросов (для вычисления значения для [in]) к базовому набору данных, поэтому я не использовал его в конце.


person Nickolay    schedule 13.10.2008    source источник


Ответы (2)


Для начала вы можете определить новую вычисляемую меру в своем многомерном выражении и указать ей использовать значение другой меры, но с примененным фильтром:

WITH MEMBER [Measures].[Incoming Traffic] AS
'([Measures].[Total traffic], [Direction].[(All)].[In])'

Всякий раз, когда вы показываете новую меру в отчете, она будет вести себя так, как если бы на нее был наложен фильтр «Направление > В», независимо от того, используется ли измерение направления вообще.

Но в вашем случае вы ХОТИТЕ, чтобы измерение направления имело приоритет при использовании .... так что все становится немного беспорядочным. Вам нужно будет определить, используется ли это измерение, и действовать соответствующим образом:

WITH MEMBER [Measures].[Incoming Traffic] AS
'IIF([Direction].currentMember = [Direction].[(All)].[Out],
    ([Measures].[Total traffic]),
    ([Measures].[Total traffic], [Directon].[(All)].[In])
)'

Чтобы увидеть, используется ли измерение, мы проверяем, использует ли текущая ячейка OUT. Если это так, мы можем вернуть Total Traffic как есть. Если нет, мы можем сказать ему использовать IN в нашем кортеже.

person Magnus Smith    schedule 14.10.2008
comment
За исключением того, что входящий трафик[исходящий] = 0, поэтому вместо ([Показатели].[Общий трафик]) я использовал 0. Большое спасибо! - person Nickolay; 15.10.2008
comment
Обратите внимание, что документы MS по Equals сказать: для сравнения объектов используйте IS (MDX). Например, используйте оператор IS, когда вы проверяете, является ли текущий элемент на оси запроса определенным элементом. - person Nickolay; 18.12.2020

Я думаю, вам следует поместить столбец в таблицу фактов Total Traffic для индикации IN / OUT и создать таблицу Dim для значений IN и Out. Затем вы можете анализировать свои данные на основе входов и выходов.

person Manish    schedule 12.01.2011