Power BI DAX技术需求:按行值汇总不同列,修复矩阵缺失行
问题背景与需求
有两个表:表A和表B,表结构及数据如下:
表A数据
| Cat |
|---|
| Fringe |
| Salary |
| Other |
表A的[cat]列包含"Fringe"、"Salary"、"Other"三个取值。
表B数据
| Cat | Amount | Fringe |
|---|---|---|
| Salary | 500 | 50 |
| Salary | 600 | 60 |
| Other | 100 | 0 |
| Other | 150 | 0 |
表B的[cat]仅包含"Salary"和"Other",且A[cat]与B[cat]为一对多关系。
需求目标
制作矩阵视觉对象,以A[cat]作为行维度,按以下规则展示汇总值:
- 当行值为"Fringe"时,展示B表所有
[Fringe]列的总和 - 当行值为"Salary"或"Other"时,展示对应分类下B表
[Amount]列的总和
期望最终矩阵结果:
| Cat | Value |
|---|---|
| Fringe | 110 |
| Salary | 1100 |
| Other | 250 |
现有问题
编写的DAX度量值无法显示"Fringe"行,仅展示Salary和Other两行:
CALCULATE( SUMX( ALL(A[cat]), SWITCH( TRUE(), A[cat] = "Fringe", CALCULATE(SUM('B'[Fringe])), A[cat] <> "Fringe", CALCULATE(SUM('B'[Amount])) ) ) )
正确DAX实现方案
原度量值的问题在于使用ALL(A[cat])覆盖了行上下文的筛选,且当行是"Fringe"时,由于B表无对应分类,默认筛选会排除该行。以下是两种可行的修正方案:
方案一:SWITCH写法
Matrix Value = SWITCH( SELECTEDVALUE(A[cat]), "Fringe", CALCULATE(SUM(B[Fringe]), ALL(A[cat])), SUM(B[Amount]) )
方案二:IF写法
Matrix Value = IF( SELECTEDVALUE(A[cat]) = "Fringe", CALCULATE(SUM(B[Fringe]), ALL(A[cat])), SUM(B[Amount]) )
逻辑说明
SELECTEDVALUE(A[cat])用于获取当前矩阵行的分类值,精准判断是否为"Fringe"- 处理"Fringe"时,通过
ALL(A[cat])清除A表分类列的筛选上下文,这样就能汇总B表所有[Fringe]值(避免因B表无Fringe分类导致的筛选过滤) - 其他分类直接利用A与B的一对多关系,自动筛选匹配的B表数据并计算
[Amount]总和
内容的提问来源于stack exchange,提问作者user6610658
相关产品推荐
相关产品推荐

