Проценты в кубе данных SSAS
Итак, у меня есть измерение под названием Attendance Mark, которое содержит строки, например, "PRESENT". У меня есть мера "Счет посещаемости", которая подсчитывает общее количество записей. Я придумал этот (в значительной степени вдохновленный поиском в Google) расчет MDX, чтобы получить процент записей меток присутствия, которые читаются как "НАСТОЯЩИЕ":
Case
When IsEmpty ([Measures].[Attendance Count])
Then NULL
Else ( [Attendance Mark].[Attendance Mark].&[PRESENT],
[Measures].[Attendance Count]) /
( [Attendance Mark].[Attendance Mark],
[Measures].[Attendance Count] )
End
Кажется, это работает, хотя я не уверен на 100% в этом, но получаю очень странные результаты, если я рассматриваю это измерение по измерению Mark. Как и следовало ожидать, PRESENT отображает 100%, но вы ожидаете, что остальные покажут 0% - потому что в их области есть 0 значений "PRESENT". Вместо этого они показывают такие вещи, как 865,29%, 1338,17% или 169,76%. Полностью ошибочные данные.
Есть идеи, где я ошибся?
PS Очевидно, что в любом случае вы бы никогда не отобразили процентную величину по измерению метки при практическом использовании, но я не хочу, чтобы это сбивало с толку пользователей, и было бы полезно понять, почему это происходит в любом случае.
1 ответ
Я разбил задачу на три простые части: числитель, знаменатель и конечный процент.
Хитрость заключается в том, что вы хотите, чтобы вычисление учитывало всех [НАСТОЯЩИХ] и не [НАСТОЯЩИХ] членов [Марк посещаемости], а также [Все] членов. Таким образом, [НАСТОЯЩЕЕ] должно быть 100%, не-[НАСТОЯЩЕЕ] должно быть нулевым, а [Все] должно быть процентом [НАСТОЯЩЕГО] от общего числа.
with
member [Measures].[x] as
aggregate(
exists(
{[Attendance Mark].[Attendance Mark].&[PRESENT]},
{[Attendance Mark].[Attendance Mark].CurrentMember}
), [Measures].[Attendance Count]
)
member [Measures].[y] as
aggregate(
exists(
{[Attendance Mark].[Attendance Mark].CurrentMember},
{[Attendance Mark].[Attendance Mark].&[PRESENT]}
), [Measures].[Attendance Count]
)
member [Measures].[z] as
[Measures].[x] / [Measures].[y], format_string = 'Percent'
select
{[Measures].[Attendance Count], [Measures].[x], [Measures].[y], [Measures].[z]} on 0,
non empty [Attendance Mark].[Attendance Mark].Members on 1
from
[cube]
где [Measures].[x]
представляет числитель, [Measures].[y]
представляет знаменатель, и [Measures].[z]
представляет окончательный процентный расчет. Очевидно, вы можете сделать это за один шаг. Я разбил это для ясности.