Фильтр вычисляемых элементов MDX по атрибуту измерения - PullRequest
14 голосов
/ 21 декабря 2011

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

(
    [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 ]

46 голосов
/ 21 декабря 2011

Во-первых, важно понять синтаксис 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] )
}

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

{
  [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 </p>

2 голосов
/ 21 декабря 2011

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

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