当前位置: 首页 > web >正文

【自记】Power BI 中 ALLNOBLANKROW的适用场景举例

  ALLNOBLANKROW 的核心价值在于 “返回基础维度表中所有有效非空白值,同时排除因数据不匹配产生的意外值或空白行”,尤其适合处理 “子表(事实表)存在父表(维度表)中没有的关联值” 的场景。以下通过具体案例说明:

场景:子表存在父表中没有的 “意外值”

假设存在两个表:

  • 父表(维度表):商品表,包含有效商品 ID:{101, 102, 103}(无空白值)。
  • 子表(事实表):销售表,包含销售记录的商品 ID:{101, 102, 102, 103, 999, BLANK}
    其中,999 是父表中不存在的 “意外商品 ID”(可能因数据录入错误产生),BLANK 是空白值(可能因未填写导致)。

        在这种情况下,当我们需要基于父表的有效商品计算 “总销售额” 或 “占比” 时,直接使用 ALL 函数会包含子表中的意外值(999)和空白值,导致结果不准确;而 ALLNOBLANKROW 可以自动排除这些无效数据,只保留父表中存在的有效商品。

具体示例:计算 “有效商品的总销售额”

1. 问题:用 ALL 函数会包含意外值和空白

若直接用 ALL 清除筛选计算总销售额:

dax

总销售额_ALL = CALCULATE(SUM('销售表'[销售额]),ALL('商品表'[商品ID])  // 清除筛选,但保留所有值(包括意外值999和空白)
)
  • 结果:包含 101、102、103、999、BLANK 对应的所有销售额(错误地将无效数据计入)。
2. 解决方案:用 ALLNOBLANKROW 排除意外值和空白

使用 ALLNOBLANKROW 只保留父表中存在的有效商品:

dax

总销售额_ALLNOBLANKROW = CALCULATE(SUM('销售表'[销售额]),ALLNOBLANKROW('商品表'[商品ID])  // 清除筛选,只保留父表中存在的非空白值(101、102、103)
)
  • 结果:仅包含 101、102、103 对应的销售额(自动排除意外值 999 和空白值)。

延伸场景:计算 “有效商品的销售占比”

当需要计算 “某商品销售额占所有有效商品总销售额的比例” 时,ALLNOBLANKROW 能确保分母是 “有效商品的总销售额”,避免意外值干扰:

dax

有效商品销售占比 = DIVIDE(SUM('销售表'[销售额]),  // 分子:当前筛选商品的销售额CALCULATE(SUM('销售表'[销售额]),ALLNOBLANKROW('商品表'[商品ID])  // 分母:所有有效商品的总销售额)
)

  • 逻辑:分母仅包含父表中存在的商品(101、102、103)的销售额,排除了 999 和空白的无效数据,确保占比计算准确。

为什么 ALLNOBLANKROW 能解决这个问题?

  1. 关联逻辑:在 Power BI 模型中,当子表的关联键(如 销售表[商品ID])在父表中不存在时,会自动生成 “空白行” 或 “意外值行”(如 999 对应的父表记录为空)。
  2. ALLNOBLANKROW 的特性:它返回的是 “父表中实际存在的非空白值集”(即 101、102、103),自动忽略子表中存在但父表中没有的关联值(999)和空白值。

总结

当子表(事实表)存在父表(维度表)中没有的 “意外值” 或空白值时,ALLNOBLANKROW 的核心作用是:

  • 清除筛选上下文,确保计算范围不受当前筛选影响;
  • 仅保留父表中存在的有效非空白值,排除因数据不匹配产生的无效数据;
  • 适用于计算 “有效维度的总基准值”“占比分析” 等场景,保证结果基于规范的维度数据。

————————————————————————————————

ALL('商品表'[商品ID])为什么会把销售表的两个多余值算上?

  ALL('商品表'[商品ID]) 会包含销售表中的 “多余值”(如 999、空白),核心原因在于 ALL 函数的作用范围和表关系的默认行为。具体可以从以下 3 个层面理解:

一、先明确:ALL 函数的本质是 “清除筛选”,而非 “限定范围”

ALL('商品表'[商品ID]) 的功能是 “清除当前对 商品表[商品ID] 的所有筛选条件”,让计算上下文包含 商品表 中所有的 [商品ID](即父表的全部有效值,如 101、102、103)。

但它不会主动过滤子表(销售表)中与父表无关的记录—— 这是关键!

二、子表的 “多余值”(如 999、空白)属于 “孤儿记录”,不受父表筛选控制

在 Power BI 中,当子表(销售表)的关联字段(如 [商品ID])存在父表(商品表)中没有的值时(如 999),或为空(BLANK)时,这些记录被称为 “孤儿记录”(Orphan Records)。

这类记录的特点是:

  • 它们在父表(商品表)中没有匹配的行(因为 999 不在商品表中,空白也没有对应的商品);
  • 父表的筛选(包括 ALL 函数)无法影响这些孤儿记录,因为它们与父表没有关联关系。

三、ALL 函数的计算逻辑:默认包含所有子表记录(包括孤儿记录)

当你用 CALCULATE(SUM('销售表'[销售额]), ALL('商品表'[商品ID])) 时,逻辑是:

  1. ALL('商品表'[商品ID]) 清除了对父表 商品ID 的筛选,让父表的所有有效值(101、102、103)都进入计算上下文;
  2. 但子表(销售表)的计算范围是 “所有与父表有效值关联的记录 + 所有孤儿记录”—— 因为孤儿记录不依赖父表的筛选,无论父表如何筛选,它们都会被默认包含。

因此,最终的计算结果会包含:

  • 父表中存在的商品(101、102、103)的销售额;
  • 子表中存在但父表中没有的商品(999)的销售额;
  • 子表中的空白值对应的销售额。

综上所述:为什么 ALLNOBLANKROW 能排除这些多余值?

  ALLNOBLANKROW('商品表'[商品ID]) 不仅会清除父表的筛选,还会 强制将计算范围限定在 “父表中存在的非空白值”

        它的逻辑是:只保留子表中与父表有效值(101、102、103)关联的记录,主动排除所有孤儿记录(999、空白),因为这些记录在父表中没有匹配项。

http://www.xdnf.cn/news/18421.html

相关文章:

  • 疏老师-python训练营-day51复习日+退款开始
  • 计算机网络技术学习-day4《路由器配置》
  • SQL 中大于小于号的表示方法总结
  • 微软宣布开源大模型gpt-oss在Azure平台实现性能突破
  • Git 新手完全指南(二):在vscode中使用git
  • 官网SSO登录系统的企业架构设计全过程
  • UNet改进(33):基于CBAM原理与PyTorch实战指南
  • Ubuntu 上安装 MongoDB
  • Hyperledger Fabric官方中文教程-改进笔记(十三)-使用测试网络创建通道
  • iOS 应用迭代与上架节奏管理 从测试包到正式发布的全流程实践
  • Scikit-learn 预处理函数分类详解
  • 阶跃星辰 StepFun 入驻 GitCode 平台,带来工业级 AI 体验
  • 密码加密算法和JWT无状态认证
  • [系统架构设计师]面向服务架构设计理论与实践(十五)
  • C++ 数据结构 和 STL
  • [Polly智能维护网络] 弹性上下文 | `ResiliencePropertyKey<TValue>`
  • WPF Alert弹框控件 - 完全使用指南
  • 2025年电赛A题省一方案
  • AR 虚实叠加技术在工业设备运维中的实现流程方案
  • 5G-A赋能AR眼镜:毫米级虚实融合的未来已来
  • 通过try-catch判断数据库唯一键字段是否重复
  • 网络流量分析——基础知识
  • MySQL 数据与表结构导出 Excel 技术文档
  • Ubuntu 主机名:精通配置与管理
  • Kafka-Eagle安装
  • SpringBoot + MyBatis-Plus 使用 listObjs 报 ClassCastException 的原因与解决办法
  • 自动驾驶汽车机器学习安全实用解决方案
  • Meta 再次重组人工智能部门
  • 自学嵌入式第二十三天:数据结构(3)-双链表
  • C语言基础:(二十)自定义类型:结构体