Определение вычисляемого элемента в многомерных выражениях — фильтрация значения меры
Вопрос
Мне нужно определить вычисляемый элемент в MDX (это SAS OLAP, но я все равно буду признателен за ответы от людей, которые работают с различными реализациями OLAP).
Значение новой меры должно рассчитываться на основе существующей меры путем применения дополнительного условия фильтра.Думаю, будет понятнее на примере:
- Существующая мера:«Общий трафик»
- Существующее измерение:«Направление» («Вход» или «Выход»)
- Мне нужно создать вычисляемый элемент «Входящий трафик», который равен «Общему трафику» с дополнительным фильтром (Направление = «Вход»)
Проблема в том, что я не знаю MDX и у меня очень плотный график (извините за вопрос новичка).Лучшее, что я мог придумать, это:
([Measures].[Total traffic], [Direction].[(All)].[In])
Что почти работает, за исключением ячеек с определенным направлением:
Похоже, что «внутренний» фильтр в Direction переопределен моим собственным фильтром).Мне нужно пересечение «внутреннего» фильтра и моего собственного.Я нутром чувствовал, что это связано с Пересечением. [Direction].[(All)].[In]
с внутренними координатами оцениваемой ячейки, но трудно понять, что мне нужно, не прочитав предварительно эту тему :)
[править] В итоге у меня получилось
IIF([Direction].currentMember = [Direction].[(All)].[Out],
0,
([Measures].[Total traffic], [Direction].[(All)].[In])
)
... но, по крайней мере, в SAS OLAP это приводит к выполнению дополнительных запросов (для вычисления значения для [in]) к базовому набору данных, поэтому в конце концов я его не использовал.
Решение
Для начала вы можете определить новую вычисляемую меру в своем многомерном выражении и указать ей использовать значение другой меры, но с примененным фильтром:
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.Если это так, мы можем вернуть общий трафик как есть.Если нет, мы можем указать ему использовать IN в нашем кортеже.
Другие советы
Я думаю, вам следует поместить столбец в таблицу фактов общего трафика для указания IN/OUT и создать таблицу Dim для значений IN и Out.Затем вы можете проанализировать свои данные на основе IN & Out.
Также взгляните на этот вопрос, там описана та же проблема, но там опубликован другой ответ.