Ответ 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