作者:sanyyy | 来源:互联网 | 2023-09-17 21:20
KEEPFILTERS, 修改在calculate或者calculatetable函数中筛选调节器的筛选方式
其语法:
KEEPFILTERS(expression), expression一般情况下指的是筛选表达式
根据定义,KEEPFILTERS是修改CALCULATE(CALCULATETABLE)筛选调节器的筛选方式,在这里想讨论两点内容:
CALCULATE函数中的筛选调节器覆盖已经存在于当前列(calcuate调节器指定的列)上的所有筛选器,对其他列的筛选器不产生影响--(参考官方文档-remarks第二段)
用一句简单的话, calculate 覆盖当前上下文,而keepfilters就是将筛选条件添加到当前上下文中。
在使用keepfilters参数时,calculate中计算公式的上下文是已经存在的上下文(Query context) 与 keepfilters参数中上下文的交集
可以通过具体的例子来感受一下
新建两个度量值计算每门课程的分数
score.filter =
CALCULATE (
SUM ( 'YiLuXiangBei Stu Score'[Score] ),
'YiLuXiangBei Stu Course'[CourseName] = "英语" // 未使用keepfilters
)
score.keepfilters =
CALCULATE (
SUM ( 'YiLuXiangBei Stu Score'[Score] ),
KEEPFILTERS ( 'YiLuXiangBei Stu Course'[CourseName] = "英语" )// 使用filters
)
结果是度量值score.filter的值全部是60,而score.keepfilters的值只有英语为60,其他全部为空白。
我们就结果分析一下
度量值score.filter使用了calculate函数,其筛选参数(调节器)是覆盖列CourseName中的筛选,在第一行中CourseName的筛选器为语文,那calculate的作用覆盖它,语文被替换成英语,结果就是60,其他同理,所以结果红框部分;
度量值score.keepfilters 使用了keepfilters函数,其作用是改变calculate的filter的工作方式,将CourseName中的筛选器添加到当前的上下文中,在第一行中CourseName的筛选器为语文,那语文与英语的交集为空,所以第一行的结果就为空,其他同理
参考文章:
https://dax.guide/keepfilters/
https://docs.microsoft.com/en-us/dax/keepfilters-function-dax