删除表中所有筛选器,已应用于指定列的筛选器除外。
语法
ALLEXCEPT ( <表名>, <列名>, [ <列名>, … ] )
参数 | 属性 | 描述 |
表名 | 已存在的物理表 | |
列名 | 可重复 | 当 ALLEXCEPT 作为 CALCULATE 调节器时,需要保留直接筛选效果的列或表。它们必须是第一个参数所在的扩展表的一部分。 |
返回值
表
完整的表或具有一列或多列的表
备注
当作为 CALCULATE 或 CALCULATETABLE 的调节器使用时,ALLEXCEPT 从第一个参数指定的扩展表中删除筛选器,只保留后续参数指定的列中的直接筛选器。
当作为表函数使用时,ALLEXCEPT 从第一参数中排除后续参数指定的列,返回表中剩余所有列的唯一组合。在这种情况下,结果只考虑当前表的列,忽略扩展表。
示例
例如,有一个有四列(a,b,x,y)的表 T,下面两个表表达式是等价的。
FILTER ( ALLEXCEPT ( T, T[a], T[b] ), // 返回只有 T[x] 和 T[y] 列的表 ) ---- 等价于下面的表达式 ---- FILTER ( ALL ( T[x], T[y] ), // 返回只有 T[x] 和 T[y] 列的表 )
不过,ALLEXCEPT 通常用作 CALCULATE 调节器,很少用作表函数。以下公式从 Sales 表的扩展表中删除所有筛选器,只保留日期表和 Customer[City]列的直接筛选。
CALCULATE ( <exp>, ALLEXCEPT ( Sales, 'Date', Customer[City] ) )
有一种情况想请教一下老师:
ALLEXCEPT作为表函数放在Filter第一参数位置,跟随Filter一起作为Calculate的表筛选器参数时:Calcultae([Measure],Filter(ALLEXCEPT(table,[ColumnName1],[ColumnName2])))
经过我的测试,这种情况下,Calculate其返回的结果依旧受到ALLEXCEPT后续参数在外部上下文中的筛选作用影响。
所以ALLEXCEPT作为表函数时,返回除了ALLEXCEPT后续参数列剩余所有列的唯一组合,更完整的描述是不是包含这样一个意思:ALLEXCEPT ALL掉的只是未包含在后续参数中的列所受到的筛选,但返回的唯一组合仍然是经其后续参数接收筛文筛选后的结果,即ALLEXCEPT作为表函数,其结果仍然受到后续参数的交叉筛选。
对比ALL(ColumnNames)作为调节器时只能忽略该列的直接筛选;所以ALL与ALLEXCEPT对于参数已经包含的列,其行为都是一样的,只能忽略被包含列的直接筛选,那么能否认为这种情况中的ALLEXCPET虽然是以表函数形式参与进来的,但其实起到的也是调节器的作用。
这个问题导致我目前对于调节器和筛选器参数的概念产生了一点混乱