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

【自记】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.dtcms.com/a/340573.html

相关文章:

  • 如何选择汽车ECU的加密方法
  • docker 部署
  • 千康BOH是店易开吗?怎么和金蝶云、用友BIP、鼎捷等ERP集成?
  • 趣打印高级版--手机打印软件!软件支持多种不同的连接方式,打印神器有这一个就够了!
  • 云手机在办公场景中的优势体现
  • 云手机在社交媒体场景中的优势体现在哪些方面?
  • AI大模型×政务热线:数造科技打造企业动态画像的“实时监测引擎”
  • 【网站测试:CORS配置错误引发的安全风险及测试】
  • 力扣【2348. 全0子数组的数目】——从暴力到最优的思考过程
  • 数学建模竞赛中评价类相关模型
  • 多人同时导出 Excel 导致内存溢出
  • Linux多线程——线程池
  • 论文见刊后能加通讯作者吗?
  • 【面试题】什么是三次握手四次挥手呢?
  • 黑盒(功能)测试基本方法详解
  • 关于删除gitlab中的分支
  • C语言:第18天笔记
  • DINOv3
  • 【Android】一文详解Android里的AOP编程
  • 专题:2025全球消费趋势与中国市场洞察报告|附300+份报告PDF、原数据表汇总下载
  • 【0基础PS】图片格式
  • LWIP的TCP协议
  • Chrome 中的 GPU 加速合成
  • Google Chrome v139.0.7258.139 便携增强版
  • IP查找的方法、工具及应用场景
  • 让Chrome信任自签名证书
  • Google Chrome 扩展不受信任 - 不受支持的清单版本 解决方案
  • 单北斗GNSS位移监测技术解析
  • 爬虫逆向--Day16Day17--核心逆向案例3(拦截器关键字、路径关键字、请求堆栈、连续请求)
  • 欧州服务器String 转 double 有BUG?