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