Power BI中SumX度量返回异常结果的原因咨询
DAX中SumX度量值的结果困惑与解析
我的数据表结构
首先是Partners表:
| PartnerID | Name |
|---|---|
| 1 | AAAA |
| 2 | BBBB |
| 3 | CCCC |
| 4 | DDDD |
然后是Sales表:
| PartnerID | SaleAmount |
|---|---|
| 1 | 15 |
| 2 | 20 |
| 3 | 30 |
| 4 | 40 |
| 1 | 15 |
我创建的度量值及可视化结果
我做了一个包含Partners表PartnerID的可视化对象,然后写了这个度量值:
TotalSalesMeasure: Sumx(Partners, Sum(Sales[SaleAmount]))
得到的表格可视化结果是:
| PartnerID | TotalSalesMeasure |
|---|---|
| 1 | 30 |
| 2 | 20 |
| 3 | 30 |
| 4 | 40 |
一开始的困惑与错误理解
我当时完全懵了,按自己的逻辑推导结果根本不对!我当时的想法是:
- Partners表会被当前上下文(也就是每个PartnerID)筛选
- 遍历筛选后的Partners表每一行,调用
Sum(Sales[SaleAmount]) - 最后把这些结果求和
就拿第一行PartnerID=1来说,我以为:
- Partners表被筛选后只剩1行
- 因为用的是Partners的行上下文而非筛选上下文,
Sum(Sales[SaleAmount])应该对整个Sales表的金额求和,也就是15+20+30+40+15=120,SumX遍历这一行后结果应该是120,但实际显示的却是30!
我之前看了个视频里的类似操作,还以为自己理解对了,甚至后来用Calculate包裹Sum的时候,得到的结果居然和这个差不多(除了总计字段)——这明明看起来像是Calculate该返回的结果啊!
后来的顿悟:筛选上下文的自动传递
折腾半天我终于搞懂问题出在哪了:我之前完全没意识到外部筛选上下文会自动应用到关联的Sales表!
来拆解这个SumX的实际逻辑:
SumX( Partners, // 这里的Partners已经被外部的PartnerID筛选上下文影响,比如当前行是PartnerID=1,这里就只剩PartnerID=1的行 Sum(Sales[SaleAmount]) // 这里不仅受Partners的行上下文影响,更关键的是外部筛选上下文(当前的PartnerID)已经通过表间关系自动传递给了Sales表!所以Sum只会计算当前PartnerID对应的SaleAmount总和 )
也就是说,当可视化里的PartnerID=1时,外部筛选上下文已经把Sales表筛选成了PartnerID=1的两行(金额15和15),所以Sum(Sales[SaleAmount])得到30,SumX遍历Partners里的这一行后,求和结果就是30,和实际显示的一致。
之前我错误认为行上下文会覆盖筛选上下文,但实际上外部筛选上下文会先作用于所有关联表,包括Sales,这才是核心的逻辑误区。
内容的提问来源于stack exchange,提问作者imrogfar
相关产品推荐
相关产品推荐

