如何在SSAS表格模型中实现MDX的CREATE MEMBER功能?
把MDX的CREATE MEMBER转换成DAX的正确姿势
先帮你理清楚核心问题:你原来的MDX是在多维Cube里创建一个虚拟维度成员,把NEW和USED两个维度值的度量结果加总,这个成员并不存在于原始维度表中。而DAX里确实没有直接对应CREATE MEMBER的语法,但我们有更适配表格模型的替代方案,先说说你的思路里的小问题,再给你推荐两种靠谱的实现方式:
你的原始思路的问题点
你想通过UNION给Condition表加一行NEW+USED,再用SWITCH处理度量值,这里有两个坑:
- 维度表与事实表的关系冲突:原始
Condition表和事实表是通过键关联的,你新增的NEW+USED行没有对应的事实表记录,直接筛选这行的话,度量值会返回空或0,必须用CALCULATE强制覆盖筛选逻辑,反而绕了弯路。 - SWITCH里的筛选逻辑错误:
'Condition'[ConditionDescription] = "New" && 'Condition'[ConditionDescription] = "Used"是逻辑与,同一行不可能同时满足两个条件,应该改成IN {"New", "Used"}或者||。
推荐方案一:用计算组(Calculation Groups)实现(最接近MDX体验)
从SSAS表格模型2019版本开始,计算组就是专门用来替代MDX计算成员的功能,完全不需要修改底层表,对所有度量值统一生效,维护成本极低:
- 在你的表格模型中新建一个计算组(比如命名为
Condition Calculations) - 在计算组里添加一个计算项,命名为
NEW+USED,写入以下DAX:
CALCULATE( SELECTEDMEASURE(), 'Condition'[ConditionDescription] IN {"New", "Used"} )
- 完成后,当你在报表或分析中选择这个
NEW+USED计算项时,所有度量值都会自动计算New和Used的总和,完全复刻MDX的效果。
推荐方案二:新建筛选表+度量值判断(适用于旧版本SSAS)
如果你的SSAS版本不支持计算组,那可以用“虚拟筛选表+度量值分支判断”的方式,不碰原始维度表:
- 新建一个独立的筛选表,用来包含原始Condition值和新增的
NEW+USED:
Condition_Filter = UNION( ALL('Condition'[ConditionDescription]), ROW("ConditionDescription", "NEW+USED") )
- 把这个新表和原始
Condition表建立单向筛选关系(从Condition_Filter到Condition) - 在你的度量值里添加判断逻辑,比如你原来的
NVC度量值可以改成:
NVC := VAR SelectedCondition = SELECTEDVALUE(Condition_Filter[ConditionDescription]) VAR BaseValue = [ABC] + [CDE] RETURN SWITCH( SelectedCondition, "NEW+USED", CALCULATE(BaseValue, 'Condition'[ConditionDescription] IN {"New", "Used"}), BaseValue // 其他情况返回原始值 )
这样用户可以通过Condition_Filter表的切片器选择NEW+USED,而原始Condition表和事实表的关系完全不受影响。
总结
- 优先用计算组,这是表格模型对MDX计算成员的原生替代,最省心;
- 旧版本用虚拟筛选表+度量值判断,不要修改原始维度表,避免破坏现有关系。
内容的提问来源于stack exchange,提问作者user1523087
相关产品推荐
相关产品推荐

