Подтвердить что ты не робот

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]
)
4b9b3361

Ответ 1

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

Ответ 2

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

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