Excel连接SSAS时MDX计算度量实现维度成员计数求助
解决SSAS多维模型中按维度层级统计总项目数的问题
我太懂你这种感受了——在SSAS Tabular里用DAX做这种层级计数简直行云流水,但MDX的多维模型思路确实得转个弯。咱们先把你之前的尝试问题拆解清楚,再给你一个精准的解决方案:
为什么你之前的尝试没达到预期?
- Attempt #1:
DISTINCTCOUNT( {[Items].[Item].MEMBERS} )这个表达式的问题在于,它会被透视表默认的「排除无交易成员」规则影响,而且钻取到Item粒度时,它还是在统计整个集合的去重数,所以返回的是父组的数值,不是你要的1。 - Attempt #2:
[Items].[Item].[Item].Count是直接取整个[Item]层级的全局总成员数,完全不受行上维度成员的过滤,所以不管你选哪个组,都返回全量总数。 - Attempt #3:
COUNT ( { [Items].[Item].MEMBERS}, EXCLUDEEMPTY)遍历整个[Item]成员集本身就很耗资源,再加上EXCLUDEEMPTY的计算逻辑,直接把Excel给撑崩了,而且这也不是你要的「包含无交易成员」的统计。
正确的MDX度量值表达式
你需要的是在当前行的维度成员上下文下,统计其下属所有[Item]层级成员的总数(包括无交易的),用这个表达式创建计算度量:
COUNT( DESCENDANTS( [Items].CurrentMember, [Items].[Item], SELF_AND_BELOW ), INCLUDEEMPTY )
表达式解释
[Items].CurrentMember:自动获取当前透视表行上选中的Items维度成员(比如「Outside Purchased Beef」组,或者某个单个Item)DESCENDANTS(..., [Items].[Item], SELF_AND_BELOW):定位到该成员下所有到[Item]层级的后代成员,如果当前就是Item层级,就只返回成员本身COUNT(..., INCLUDEEMPTY):统计这些成员的数量,强制包含没有交易数据的空成员,完美匹配你要的「总项目数41」的需求
验证场景
- 当行上是「Outside Purchased Beef」组时:返回该组下所有Item的总数(41),不管有没有交易记录
- 当行上是单个Item时:返回1,完全符合你的最低粒度要求
这个表达式的计算效率也很高,因为它只针对当前成员的子级进行统计,不会遍历整个维度的所有成员,再也不会出现Excel冻结崩溃的问题。
内容的提问来源于stack exchange,提问作者SherlockSpreadsheets
相关产品推荐
相关产品推荐

