Фильтр вычисляемых элементов 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.

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

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

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

это вернет каждого члена из


попробуйте следующий синтаксис:

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