Определите вычисляемый элемент в многомерных выражениях, отфильтровав значение меры

#sas #olap #mdx

Вопрос:

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

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

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

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

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

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

пример

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

[обновление] В итоге я получил

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

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

Ответ №1:

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

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

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

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

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

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

Комментарии:

1. За исключением того, что входящий трафик[выходит] = 0, поэтому вместо «([Меры]. [Общий трафик])» Я использовал «0». Большое спасибо!

2. Обратите внимание, что в документах MS на равных говорится: Для сравнения объектов используйте оператор IS (многомерные выражения) . Например, используйте оператор IS, когда вы проверяете, является ли текущий элемент на оси запроса определенным элементом.

Ответ №2:

Я думаю, что вам следует поместить столбец в таблицу фактов общего трафика для индикации ВХОДА/ВЫХОДА и создать тусклую таблицу для значений ВХОДА и выхода. Затем вы можете проанализировать свои данные на основе IN amp; Out.