CALCULATE(m, x=red)与CALCULATE(m, KEEPFILTERS(x=red))的区别咨询
嘿,这个问题我当初啃DAX的时候也卡了好久,用大白话加实际例子给你掰扯明白!二者的本质差异,在于如何处理外部上下文里的同列筛选条件——是直接替换,还是叠加取交集。
1. 不带KEEPFILTERS:直接“替换”同列外部筛选
CALCULATE(m, x=red) 的逻辑特别直接:把当前上下文里所有关于列x的筛选条件直接扔掉,换成x=red,再计算度量值m。
举个实际场景:假设你正在看“颜色为蓝色和红色的产品销售额”(外部上下文已经筛选了x=blue和x=red),用这个公式的话,会直接把颜色筛选改成仅red,最终得到的是所有红色产品的销售额,完全不管之前的蓝色筛选。
再极端点:如果外部上下文是x=blue,用这个公式会直接忽略蓝色的筛选,强行计算红色产品的销售额——相当于把筛选条件彻底换掉了。
2. 带KEEPFILTERS:和外部筛选“取交集”
CALCULATE(m, KEEPFILTERS(x=red)) 的逻辑是“温和叠加”:不替换外部的筛选,而是让内部的x=red和外部关于x的筛选条件同时生效,也就是取两者的交集,再计算m。
还是用刚才的极端例子:外部上下文是x=blue,内部要求x=red,两个条件没有交集(没有产品既是蓝色又是红色),所以最终结果就是空白或者0。
再换个更能体现差异的场景:外部上下文是x=red, blue, green,内部用KEEPFILTERS(x=red || x=yellow),这时候外部筛选是red, blue, green,交集只有red,结果是红色产品的销售额;而不带KEEPFILTERS的话,会直接替换成red || yellow,结果是红色+黄色产品的销售额——这时候差异就非常明显了。
一句话总结
- 普通
CALCULATE的筛选参数是“霸道替换”同列外部筛选; - 加了
KEEPFILTERS之后,是“温和叠加”,和外部筛选取交集后再计算。
内容的提问来源于stack exchange,提问作者Przemyslaw Remin

