Пользовательская консолидация MDX: консолидировать только потомков последнего уровня - PullRequest
1 голос
/ 13 ноября 2011

Я ищу элегантное выражение 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]

1 Ответ

0 голосов
/ 13 ноября 2011

Не уверен, что вы хотите рассчитать, но давайте предположим, что [Участник] является членом, которого вы хотите оценить:

Я бы использовал функции потомков , и isLeaf MDX :

 Sum( 
   Filter( Descendants( [Member] ), isLeaf(Member_hierarchy.currentmember) )
   ,[M])

Вы добавляете всех потомков, включая самого себя, которые являются листьями (без детей).

...