当我们需要在度量值中清除某些筛选器时,除了有All函数外,还有ALLEXCEPT函数。
ALL函数是,清除指定列上的筛选器;
ALLEXCEPT函数是保留指定列上的筛选器并清除其他列上的筛选器
其语法如下:
ALLEXCEPT(表名,列名1[,列名2]…)
正如ALL函数一样,有时清除筛选器并会返回表,有时仅仅是清除筛选器
注1:该函数与All函数不同的一点是,必须有2个参数。
当ALLEXCEPT作为表函数时,返回的是其他列的非重复值,这些列不在指定的列中,并保留空值
假设一张表A有3列,{a, b, c}, 那allexcept(A, a),返回的是{b,c}的组合非重复值,
例如,下面的公式会返回分数表中其他列的非重复值,并保留空值,除“分数”外(这里就用计算表举例了,当然了用于度量值也是可以的)
EVALUATEVAR t_allexcept =ALLEXCEPT ('YiLuXiangBei Stu Score','YiLuXiangBei Stu Score'[Score])RETURNt_allexcept

如果用All函数来写一个等价的公式如下:
EVALUATEVAR t_all =ALL ('YiLuXiangBei Stu Score'[Stu],'YiLuXiangBei Stu Score'[CourseName])RETURNt_all
注2:
当指定的表中只有一列时,使用ALLEXCEPT函数时,不会返回任何值

当ALLEXCEPT函数仅仅用于清除筛选器时,仅仅保留指定列中的筛选器
下面的DAX公式,通过ALLEXCEPT函数仅仅保留了“成绩表”中的科目的筛选作用,所以成绩表中的Stu对该度量值不再起筛选作用(左图),又因为成绩表的扩展表包括学生表,所以allexcept函数也清除了来自学生表的筛选(右图)
score.allexcept =CALCULATE (SUM ( 'YiLuXiangBei Stu Score'[Score] ),ALLEXCEPT ('YiLuXiangBei Stu Score','YiLuXiangBei Stu Score'[CourseName]))

总结一下:
1. 当ALLEXCEPT作为表函数时,返回的是其他列的非重复值,这些列不在指定的列中,并保留空值
2.当ALLEXCEPT函数仅仅用于清除筛选器时,仅仅保留指定列中的筛选器。
3. ALLEXCEPT函数还有一种特殊的用法ALLEXCEPT(表1, 表2)其中表1的扩展表包含表2,有机会再介绍这种用法吧
我是BISeven,欢迎交流
参考资料:
https://docs.microsoft.com/en-us/dax/allexcept-function-dax
https://dax.guide/allexcept/




