Фильтр вычисляемых элементов MDX по атрибуту измерения

Я хочу создать вычисляемый элемент и отфильтровать его по измерению. Это РАБОЧИЙ пример:

(
    [Policy].[Policy Status].&[Void], 
    [Policy].[Tran Type].&[Renewal], 
    [Measures].[FK Policy Distinct Count]
)

Но если я хочу отфильтровать это так

(
    [Policy].[Policy Status].&[Void], 
    [Policy].[Policy Status].&[Policy],  
    [Measures].[FK Policy Distinct Count]
)

Чем это не работает. Это говорит о том, что одна и та же иерархия отображается несколько раз в кортеже.

Другое дело, как исключить строки? Вот идея...

(
    ![Policy].[Policy Status].&[Void], 
    ![Policy].[Policy Status].&[Policy],  
    [Measures].[FK Policy Distinct Count]
)

2 ответа

Решение

Во-первых, важно понимать синтаксис MDX и его связь с концепциями кортежей, членов и множеств.

Кортеж

Использование скобок обозначает кортеж:

(
  [Policy].[Policy Status].&[Void], 
  [Policy].[Tran Type].&[Renewal], 
  [Measures].[FK Policy Distinct Count]
)

Кортеж может включать только одного члена из любой иерархии.

наборы

Чтобы получить результаты от нескольких членов в одной иерархии, вы должны запросить набор. Набор MDX обозначается фигурными скобками:

{
  [Policy].[Policy Status].&[Void], 
  [Policy].[Policy Status].&[Policy]
}

Набор по определению

упорядоченная коллекция из нуля, одного или нескольких кортежей.

Итак, если вы хотите запросить [FK Policy Distinct Count] мера против обоих этих членов, каждый набор набора должен включать меру:

{
  ( [Policy].[Policy Status].&[Void],   [Measures].[FK Policy Distinct Count] ), 
  ( [Policy].[Policy Status].&[Policy], [Measures].[FK Policy Distinct Count] )
}

Чтобы упростить это выражение, можно объединить два набора различной размерности:

{
  [Policy].[Policy Status].&[Void],
  [Policy].[Policy Status].&[Policy], 
  [Policy].[Policy Status].&[Something], 
  [Policy].[Policy Status].&[Something else], 
  [Policy].[Policy Status].&[Yet another member]
}
*
{
  [Measures].[FK Policy Distinct Count]
}

Исключая строки

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

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

В этом примере я собираюсь предположить, [Policy].[Policy Status] является иерархией атрибутов, и что ее единственный уровень имеет уникальное имя [Policy].[Policy Status].[Policy Status],

EXCEPT(
  [Policy].[Policy Status].[Policy Status],
  {
    [Policy].[Policy Status].&[Void],
    [Policy].[Policy Status].&[Policy]
  }
)

Это вернет каждого участника из [Policy].[Policy Status].[Policy Status] уровень, кроме [Policy].[Policy Status].&[Void] а также [Policy].[Policy Status].&[Policy],

Чтобы получить полезные результаты, мы можем объединить результат по мере:

EXCEPT(
  [Policy].[Policy Status].[Policy Status],
  {
    [Policy].[Policy Status].&[Void],
    [Policy].[Policy Status].&[Policy]
  }
)
*
{
  [Measures].[FK Policy Distinct Count]
}

Использование набора в качестве одного члена

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

Их несколько, и правильное использование зависит от данных, хранящихся в вашем кубе: MIN, MAX, COUNT, а также SUM некоторые из них (см. "Числовые функции" в справочнике по функциям MDX для более полного списка). В этом примере я предполагаю, что ваши измерения агрегируются с использованием SUM:

SUM(
  EXCEPT(
    [Policy].[Policy Status].[Policy Status],
    {
      [Policy].[Policy Status].&[Void],
      [Policy].[Policy Status].&[Policy]
    }
  ),
  [Measures].[FK Policy Distinct Count]
)

Здесь я передал меру для агрегирования в качестве второго параметра в SUM.


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

<3

Попробуйте этот синтаксис:

SUM({[Policy].[Policy Status].&[Void], [Policy].[Policy Status].&[Policy]}, [Measures].[FK Policy Distinct Count])
Другие вопросы по тегам