DAX 实战套路(四)——keepfilters 函数应用

calculate函数有个特性,就是当内部筛选条件和外部筛选条件冲突时,内部筛选条件会强制替换外部筛选条件,但是有时候我们并不想它强制替换,此时就需要用到keepfilters函数。如下图
file
我们想要的过滤器是(年=2014&月=7||月=8)||(年=2015&月=8||月=9),但是在时间的层次结构中则是完全不同的过滤器,对月份筛选分别为 7 8 9,对年份的筛选分别为2014,2015,。所以内部对2014年全年求和时,会计算的7 8 9三个月的销售额,2015年也同样。度量值自动封装calculate函数,会强制替换外部筛选条件,所以此时需要利用keepfilters函数,将内部筛选条件与外部筛选条件取交集,而不是强制替换,示例如下:
file

我们再来看看另一个例子,某公司规定,单笔销售数量大于10的订单才算有效订单,求各类产品的平均销售额,有的同学写了下面的公式,
file
我们来分析下这段公式,
内部筛选条件为filter函数返回表,条件是销售数量大于10,
外部筛选条件为addcolumns提供的产品分类。
因为filter返回的为表,根据扩展表理论,将影响其对应的扩展表——产品分类表,而calculate函数转化之后,内部条件为全部产品分类表,外部条件addcolumns提供的对应分类,所以内部条件强制替换外部条件,结果返回的是全部产品的对应的销售平均值,显然是错误的。
这里提供两种方法,
方法一 就是消除扩展表的影响,这也是意大利人提倡的DAX黄金法则:筛选条件能用列的,就不要用表,
因为只要使用筛选表,你就要考虑它对扩展表的影响。
file
方法二 就是利用keepfilters函数将calculate的内部条件和外部条件取交集,而不是强制替换,
file
其实这个还有其他很多种解法,比如在整个内部条件外面添加calculate函数将行上下文转化为筛选上下文,欢迎大佬们提供keepfilters函数的其他用法。

佐罗老师DAX实战课程链接:https://study.163.com/course/introduction/1006191059.htm?share=1&shareId=1144761414
限时送价值198 DAX基础课程(仅限本链接购买)和价值288会员模板,提供内部答疑群,购买后联系QQ:40733580