加入 PowerBI自己学 知识星球:下载源文件,边学边练;遇到问题,提问交流,有问必答。
在PowerBI中,度量值返回空值和返回0是两回事。数据表里没有数或者是空值算出来会是空值,数据表中有数算出来是0才是0。在报告中,空值与维度字段结合默认不显示,只有当度量值有值(包括0)时,维度字段的值才会显示出来,这样的规则会让图表更有针对性、更简洁易读。
下表中,客户C对应的销量是空值。
在画布中,客户C的销量是空值,默认隐藏。
如果希望全量展示维度字段的值,可以在图表的字段上点击鼠标右键,显示无数据的项目。
这时空值对应的维度字段的值也会显示出来,但是显示为空,有些用户希望这个空显示为0。
还有一种情况,在卡片图中,这种空,会直接显示成“(空白)”,有些用户希望这个空白也显示为0。
如下是筛选了客户C的销量,显示汉字空白(英文环境为BLANK)。
解决方案
通常情况下,针对度量值返回空值,把度量值在末尾+0或者使用条件判断空值返回0,就能解决问题。
举例
模型
度量值
销量:
Sales = SUM('订单表'[数量])
度量值+0:
Sales+0 = SUM('订单表'[数量])+0
度量值使用条件判断:
Sales_IF_Blank = IF(ISBLANK(SUM('订单表'[数量])), 0, SUM('订单表'[数量]))
坑点
1 如果是使用星型架构建模,报告中的维度字段来自于维度表,上述方案可以奏效。如果是单表模型,DAX有一个Auto-Exist机制,当同一个表的两个或多个列被同时筛选时,Auto-Exist机制就会发挥作用,未产生交叉的部分不会做无用计算。即便用了上述方案,不交叉的部分在矩阵中的行和列中交叉依然会显示空白(不是空值,是没有交叉,什么内容都没有)。在矩阵中使用订单表中的人员和产品,上述方案度量值依然显示空白。
基于这个原因,请使用星型架构搭建模型。
2 上述方案在补0的同时,会把原本返回空的所有的维度值都带出来,比如日期对应的销量,未来没有销量的日期也会带出来返回0。这个时候需要再增加一层条件判断,如果当前上下文的最小日期大于订单表的最大日期,就返回空,否则返回补0的度量值。
Sales+0_IF_Date = IF(MIN('日期表'[Date])>MAXX(ALL('订单表'),[日期]), BLANK(), [Sales+0])
3如果在星型架构的基础上使用了雪花维度,比如产品单独一张表,品类单独一张表,品类表一对多筛选产品表。当给度量值补0的时候,品类和产品的筛选将不再起作用,被常量0打回原形,形成了全量笛卡尔积。此时,要么将品类合并到产品表中(PowerQuery合并查询或在产品表中使用RELATED新建列),调整成不带雪花维度的星型架构;要么使用ISEMPETY函数,先判断产品表是不是空,然后基于判断结果,控制度量值返回的值。
Sales+0_IF_Date_IS_Empty = IF(ISEMPTY('产品表'), BLANK(), [Sales+0_IF_Date])