如何在MDX中计算层级结构每个组的总和?求修正MDX查询
修正MDX查询获取组总和的方案
首先得说,你原查询的问题出在父成员的上下文和维度层级的关联上——当你在行上交叉Group Name和Department ID的所有子成员时,[Department].[Department ID].currentmember.parent不一定能准确指向对应的Group成员,尤其是如果维度层级结构不是严格的Group Name -> Department ID,或者交叉元组导致上下文混乱的话,结果肯定不对。
下面给你两种针对性的修正方案,根据你的实际需求选:
方案1:保留原交叉行结构
如果必须维持Group Name和Department ID交叉的行展示形式,我们用Ancestor函数明确锁定Group层级,确保聚合的是当前Department所属组的总和:
WITH MEMBER [GroupCount] AS -- 明确获取当前Department ID所属的Group Name层级成员,聚合其下所有Pay Frequency的总和 Aggregate( Ancestor([Department].[Department ID].CurrentMember, [Department].[Group Name]), [Measures].[Pay Frequency] ) SELECT {[Department].[Group Name].[All].Children * [Department].[Department ID].[All].Children} ON ROWS, {[Measures].[Pay Frequency], [GroupCount]} ON COLUMNS FROM test
方案2:使用自然层级导航(更清晰的分组)
如果你其实是想按Group分组,再展示下属的Department ID(避免无效交叉组合),用DrilldownLevel来呈现层级结构,同时GroupCount会自动对应组的总和:
WITH MEMBER [GroupCount] AS -- Group成员的总和就是自身的Pay Frequency;Department成员的总和是所属Group的总和 Aggregate( [Department].[Group Name].CurrentMember, [Measures].[Pay Frequency] ) SELECT -- 先展示所有Group,展开后显示下属的Department ID DrilldownLevel([Department].[Group Name].[All]) ON ROWS, {[Measures].[Pay Frequency], [GroupCount]} ON COLUMNS FROM test
关键修正点说明
- 替换
currentmember.parent为Ancestor函数:Ancestor能精准指定要获取的父层级(这里是[Department].[Group Name]),避免因维度结构或上下文导致的错误指向。 - 避免无意义交叉:如果你的维度是
Group -> Department的层级关系,交叉两个层级的所有子成员会生成很多无效组合(比如Group A和不属于它的Department B),用DrilldownLevel能保证层级关联的正确性。
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

