Фильтр вычисляемых элементов 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
,
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
Попробуйте этот синтаксис:
SUM({[Policy].[Policy Status].&[Void], [Policy].[Policy Status].&[Policy]}, [Measures].[FK Policy Distinct Count])