Я ищу элегантное выражение MDX, которое суммирует значения только элементов измерения последнего уровня:
У меня есть мера M, также у меня есть иерархический родитель - дочернее измерение U, которое является несбалансированным деревом:
R -> ( M = R1 + R2 = 157 )
..R1 -> ( M = R11 + R12 = 150 )
...R11 -> ( M=R111 = 100 )
.....R111 -> M=100
...R12 -> M = 50
..R2 -> M = 7
У меня есть набор, содержащий некоторые элементы из этого измерения:
S содержит R11, R111, R12
Теперь мне нужно взять для U.currentMember значение M (то есть сумма потомков последнего уровня )
Я написал это выражение, оно работает, но, возможно, это более элегантный способ написать:
with member measures.XX as
sum (
intersect(
[S],
Except(
descendants( [U].currentMember ),
existing( descendants( [U].currentMember ).item(0) )
)
)
,
[M]
)
select
measures.xx on columns
from [CUBE]
where [U].[R]
Примечание: этот MDX не запускается:
with member measures.XX as
sum (
intersect(
[S],
descendants( [U].currentMember )
)
,
[M]
)
select
measures.xx on columns
from [CUBE]
where [U].[R]
потому что вернуть 250 вместо 150.
Правильный результат - 150: R11 + R12 (потому что R111 включен в R11).
Плохой результат: 250: значение '100' берется дважды R11 + R111.
Окончательное решение:
with member measures.XX as
sum(
intersect (
descendants([U].currentMember,,leaves),
[S]
)
,
[M]
)
select
measures.XX on 0,
descendants( [Unitats].[Unitat].[All] ) on 1
from [C]