KEEPFILTERS与REMOVEFILTERS的适用场景及示例问询
一、REMOVEFILTERS:清除筛选上下文,获取全局/不受限指标
适用场景
- 明确清除指定列或表的所有筛选上下文,替代
ALL/ALLSELECTED的筛选清除用法,语义更直观 - 计算占比、同比/环比时,作为不受当前筛选影响的基准值(比如总销售额、上期全量数据)
示例
计算分类销售额占总销售额的比例
总销售额需要不受当前分类筛选的影响,用REMOVEFILTERS明确清除Category列的筛选:销售额占比 = DIVIDE( SUM(Sales[Amt]), CALCULATE(SUM(Sales[Amt]), REMOVEFILTERS(Sales[Category])) )对比传统
ALL(Sales[Category])写法,REMOVEFILTERS直接表达“移除该列筛选”的意图,可读性更强。清除整个表的筛选,获取全局总销售额
全局总销售额 = CALCULATE(SUM(Sales[Amt]), REMOVEFILTERS(Sales))效果与
CALCULATE(SUM(Sales[Amt]), ALL(Sales))完全一致,但语义更清晰,避免ALL函数的多用途混淆(ALL既可以清除筛选,也可以返回全量表)。
二、KEEPFILTERS:保留原有筛选,实现交集式叠加筛选
适用场景
- 避免
CALCULATE默认的“同列筛选替换”行为,保留原有筛选上下文的同时,叠加新的筛选条件 - 替代
FILTER(VALUES(列), 条件)的写法,实现对当前筛选范围内数据的二次筛选
示例
在已有筛选基础上,叠加数值范围筛选
假设当前报表已筛选Category = "电子",现在要计算该分类下Amt > 1000的销售额:电子类大额销售额 = CALCULATE( SUM(Sales[Amt]), KEEPFILTERS(Sales[Amt] > 1000) )如果省略
KEEPFILTERS,CALCULATE会先清除Amt列的潜在筛选(若有)再应用新条件;而KEEPFILTERS会保留原有Category的筛选,仅在该范围内取Amt > 1000的行,实现两个筛选的交集。简化
FILTER(VALUES(...))的写法
对应你提到的保留筛选上下文的场景,FILTER(VALUES(Sales[Amt]), Sales[Amt] > 1000)可以用KEEPFILTERS简化:筛选后销售额 = CALCULATE( SUM(Sales[Amt]), KEEPFILTERS(Sales[Amt] > 1000) )两者效果完全一致,但
KEEPFILTERS写法更简洁直观。多条件同列筛选的叠加
若原有筛选上下文是Amt BETWEEN 500 AND 2000,现在要追加Amt > 1000的筛选:叠加筛选后销售额 = CALCULATE( SUM(Sales[Amt]), KEEPFILTERS(Sales[Amt] > 1000) )最终筛选范围会是
1000 < Amt <= 2000;若不用KEEPFILTERS,则会直接替换为Amt > 1000,忽略原有500的下限。
核心区别总结
REMOVEFILTERS:主动清除筛选,用于脱离当前上下文计算基准值KEEPFILTERS:保留原有筛选,用于叠加条件实现交集筛选
内容的提问来源于stack exchange,提问作者variable

