【自记】Power BI 中 ALL、ALLSELECTED、ALLEXCEPT、ALLNOBLANKROW 的区别说明
在 DAX 中,ALL
、ALLSELECTED
、ALLEXCEPT
、ALLNOBLANKROW
均为筛选上下文控制函数,用于修改或清除筛选条件,但它们的作用范围、保留 / 清除的筛选类型及处理空白值的逻辑有显著差异。以下通过统一场景 + 示例对比说明:
统一场景
假设有两个表:
- 商品表(维度表):含
[商品ID]
(101、102、103)、[类别]
(电子、服装、电子),无空白值。 - 销售表(事实表):含
[商品ID]
(101、102、102、103、999、BLANK)、[销售额]
(100、200、200、300、400、50)。- 其中
999
是商品表中不存在的 “孤儿 ID”,BLANK
是空白值。
- 其中
当前报表筛选:页面切片器选择了 [类别] = "电子"
(即商品 101、103)。
四个函数的核心区别与示例
函数 | 核心功能 | 保留的筛选 | 空白 / 孤儿值处理 | 示例(计算总销售额) | 结果(基于场景) |
---|---|---|---|---|---|
ALL | 清除指定表 / 列的所有筛选,返回完整数据集 | 不保留任何筛选(包括报表层面的筛选) | 保留空白值和孤儿记录(如 999、BLANK) | dax ALL总销售额 = CALCULATE(SUM('销售表'[销售额]), ALL('商品表')) | 100+200+200+300+400+50=1250 |
ALLSELECTED | 保留报表层面的用户筛选(如切片器、筛选器),清除内部行 / 列筛选 | 保留外部用户筛选(如本场景的 [类别] = "电子" ),清除内部筛选 | 保留空白值和孤儿记录 | dax ALLSELECTED总销售额 = CALCULATE(SUM('销售表'[销售额]), ALLSELECTED('商品表')) | 100(101)+300(103)=400 |
ALLEXCEPT | 仅保留指定列的筛选,清除其他所有列的筛选 | 保留指定列的筛选(如指定 [类别] ,则保留 [类别] = "电子" ),清除其他列筛选 | 保留空白值和孤儿记录 | dax ALLEXCEPT总销售额 = CALCULATE(SUM('销售表'[销售额]), ALLEXCEPT('商品表', '商品表'[类别])) | 100(101)+300(103)=400 |
ALLNOBLANKROW | 清除指定表 / 列的所有筛选,排除空白行和孤儿记录(仅保留维度表中的有效值) | 不保留任何筛选(同 ALL ) | 排除空白值和孤儿记录(999、BLANK) | dax ALLNOBLANKROW总销售额 = CALCULATE(SUM('销售表'[销售额]), ALLNOBLANKROW('商品表')) | 100+200+200+300=800 |
关键差异详解
1. ALL
:完全清除筛选,保留所有值(包括无效数据)
- 核心逻辑:无视任何筛选条件(无论是报表层面的用户筛选,还是模型内部的行筛选),返回指定表 / 列的全部数据。
- 示例解析:场景中
ALL('商品表')
会清除 “类别 = 电子” 的筛选,同时包含销售表中所有记录(包括 101、102、103、999、空白),因此总销售额为 1250。 - 典型场景:计算 “占总体的比例”(如某商品销售额占所有商品总销售额的比例)。
2. ALLSELECTED
:保留用户筛选,清除内部筛选
- 核心逻辑:仅保留 “用户在报表上手动选择的筛选”(如切片器、筛选器面板的选择),但清除计算内部的行 / 列筛选(如表格中的行级筛选)。
- 示例解析:场景中用户筛选了 “类别 = 电子”,
ALLSELECTED
会保留这个筛选,因此只计算 101、103 的销售额(400)。若在表格中单独筛选 101,ALLSELECTED
仍返回 400(保留用户的 “电子” 筛选)。 - 典型场景:计算 “在当前选择范围内的总计”(如表格中每行占当前筛选总销售额的比例)。
3. ALLEXCEPT
:仅保留指定列的筛选,清除其他
- 核心逻辑:明确指定需要保留的列的筛选,其他所有列的筛选全部清除(包括报表层面的筛选)。
- 示例解析:
ALLEXCEPT('商品表', '商品表'[类别])
表示 “只保留[类别]
列的筛选(即‘电子’),清除[商品ID]
等其他列的筛选”,因此结果与ALLSELECTED
相同(400)。若指定保留[商品ID]
,则会保留对[商品ID]
的筛选,清除[类别]
筛选。 - 典型场景:需要固定某一维度的筛选(如固定 “区域”),同时允许其他维度自由筛选。
4. ALLNOBLANKROW
:清除筛选,排除无效数据
- 核心逻辑:与
ALL
类似(清除所有筛选),但会自动排除维度表中不存在的孤儿记录和空白值,只保留维度表中的有效数据。 - 示例解析:
ALLNOBLANKROW('商品表')
清除所有筛选后,仅保留商品表中存在的 101、102、103 的销售额(排除 999 和空白),因此总销售额为 800。 - 典型场景:计算 “基于有效维度的总基准值”(如排除无效 ID 和空白后的总销售额)。
对比总结
函数 | 筛选处理核心差异 | 数据范围差异 | 一句话记忆点 |
---|---|---|---|
ALL | 清除所有筛选 | 包含所有值(有效 + 无效) | “全部都要,不管筛选和有效性” |
ALLSELECTED | 保留用户筛选,清除内部筛选 | 包含筛选范围内的所有值 | “尊重用户选择,不管内部细节” |
ALLEXCEPT | 仅保留指定列的筛选,清除其他 | 包含指定列筛选范围内的所有值 | “指定列留下,其他都清除” |
ALLNOBLANKROW | 清除所有筛选 | 仅包含维度表中的有效值 | “全部都要,但只保留有效数据(排除无效和空白)” |
通过这个场景可以清晰看出:选择函数的核心是明确 “需要保留哪些筛选” 和 “需要包含哪些数据(是否排除无效值)”。