在 Power BI 的 DAX 中,ALLEXCEPT()
是一个非常重要的函数,用来实现**"在保留部分筛选条件的前提下,移除其他所有筛选器"**,它常用于 同比、占比、累计汇总 等分析中。
✅ 一、ALLEXCEPT 是什么意思?
函数全称:
ALLEXCEPT(table, column1, column2, ...)
作用:
保留你指定的列的筛选器,移除该表中其他列上的所有筛选器。
🔍 二、语法结构
ALLEXCEPT(<table>, <column1>, <column2>, ...)
参数 | 说明 |
---|---|
table |
要移除筛选器的表 |
column1, column2 |
你想保留筛选上下文的字段 |
📊 三、为什么需要 ALLEXCEPT?
有时我们想要做分组内的汇总或对比,但又不想被其他字段干扰,这时就可以用 ALLEXCEPT。
🎯 四、使用示例
🔸 示例 1:按"产品类别"保留筛选,计算每个类别的总销售额
Category Sales =
CALCULATE(
SUM(Sales[Amount]),
ALLEXCEPT(Sales, Sales[Category])
)
这个公式的意思是:
忽略所有其他筛选条件,仅按Category
来分组求和。非常适合后续计算占比!
🔸 示例 2:计算某城市销售额占该省的比例
城市销售额占比 =
DIVIDE(
SUM(Sales[Amount]),
CALCULATE( SUM(Sales[Amount]), ALLEXCEPT(Sales, Sales[Province]) )
)
意思是:
分母计算该省的总销售额,忽略城市等其他筛选 ,从而得到该城市在本省中的占比。
🔸 示例 3:分产品类别计算最大销售额(忽略其他筛选)
Max Sales Per Category =
CALCULATE(
MAX(Sales[Amount]),
ALLEXCEPT(Sales, Sales[Category])
)
🧠 五、与其他函数对比
函数名 | 作用 |
---|---|
ALL() |
移除所有筛选器 |
REMOVEFILTERS() |
与 ALL 类似,但语义更清晰,不返回值集合 |
ALLEXCEPT() |
保留指定列的筛选器,移除该表中其他所有列的筛选器 |
📌 六、常见应用场景
场景 | 使用 ALLEXCEPT 的目的 |
---|---|
同一类别下求汇总 | 保留 Category ,忽略其他干扰筛选 |
省内各城市占比 | 保留 Province ,忽略城市等其他筛选 |
某字段分组内的最大/平均值 | 保留分组字段,忽略其他上下文 |
构建环比/同比时排除时间筛选 | 搭配 DATEADD 等函数使用 |
✅ 总结一句话:
ALLEXCEPT 可以让你保留一个或多个字段的分组逻辑,同时移除其他字段的筛选影响,是做"分组内汇总"、"占比计算"的利器。