Power BI中DAX度量嵌套计算异常问题求助
为什么DAX度量直接引用另一个度量和用变量存储结果会有差异?
你遇到的问题核心是DAX的上下文迭代与度量的上下文敏感性,具体原因如下:
原度量的问题分析
原第二个度量代码:
Sum for current Monday = CALCULATE(SUM(Arkusz1[Values]),FILTER(Arkusz1,Arkusz1[Date] = [Curr Monday]))
这里的FILTER函数会逐行遍历Arkusz1表的每一行,每遍历一行就会触发一次[Curr Monday]度量的计算。而[Curr Monday]里的CALCULATE会继承当前FILTER的行上下文并转换为筛选上下文——也就是说,当遍历到某一行时,该行的Data会被临时作为筛选条件,此时[Curr Monday]的计算逻辑会变成:在当前行日期的筛选下,判断是否是周一,如果是就返回该日期,否则返回空。
当遍历到周一的行时,[Curr Monday]会返回该行的日期,此时Arkusz1[Date] = [Curr Monday]会匹配所有和该行日期相同的行(也就是该周一的所有数据行);当遍历到非周一的行时,[Curr Monday]返回空,不会匹配任何行。最终FILTER会把所有周一对应的行都保留下来,SUM的结果自然就是所有周一的数值总和,而非你想要的“当前周一”。
变量写法正确的原因
修改后的度量用变量存储[Curr Monday]的逻辑:
Sum for current Monday = var cm = CALCULATE(MAX(Arkusz1[Data]),WEEKDAY(Arkusz1[Data], 2) = 1) RETURN CALCULATE(SUM(Arkusz1[Wartość]),Arkusz1[Data] = cm)
变量cm的计算是在整个度量的初始筛选上下文下完成的(也就是报表层面或外部切片器的筛选条件),只会计算一次,得到的是当前上下文对应的周一日期。之后的CALCULATE用这个固定的日期值去筛选Arkusz1表,自然只会选中该周一的所有行,得到正确的单周一总和。
总结
- 直接引用度量时,度量会在迭代的每一行上下文里重新计算,导致筛选范围扩大;
- 用变量存储结果时,逻辑只在初始上下文计算一次,得到固定值,筛选范围精准。
内容的提问来源于stack exchange,提问作者Magda
相关产品推荐
相关产品推荐

