在数据可视化中,根据数值大小自动调整显示单位(如K、M、B等)是一种常见的需求,它可以使报表更加清晰易读。本篇文章将介绍如何在PowerBI中实现这种自适应单位的方法。
问题描述
计算各产品的总销售额,并进行单位的格式化,将根据数值的大小自适应地显示成合适的单位,并保留一位小数,可用的单位有:个(无单位)、千(K)、万(W)、百万(M)、十亿(B)等。
具体问题如下图所示:
本案例的初始数据如下:
订单表:
日期 | 产品 | 销售额 |
---|---|---|
2025年1月1日 | A | 111000 |
2025年1月1日 | A | 800000 |
2025年1月2日 | B | 32340 |
2025年1月2日 | C | 8600 |
2025年1月3日 | A | 610000 |
2025年1月3日 | D | 2300 |
2025年1月4日 | B | 13001 |
2025年1月4日 | C | 1200 |
2025年1月5日 | E | 300.36 |
2025年1月5日 | E | 220 |
2025年1月5日 | D | 310 |
若需其它辅助表等,可自行创建并建模。
解题要点
关于单位显示与格式化的场景中,大概有以下几种处理方法:
1、使用FORMAT函数:
该方法的自由度最高,可以在数值的末尾随意拼接字符串,因此无论什么单位都可以使用该方法来处理。但也有缺点,那就是返回结果实际上是一个字符串,而不再是数值,因此后续的计算如果要引用该度量值的,那么将不太方便。
2、使用动态数据格式:
该方法略有局限性,当遇到格式字符串无法表达的单位或格式时将不再适用。但优点也很明显,虽然视觉上看到的是带单位的数值文本,但度量值的返回结果本质上仍然是一个数值,它只是稍微给结果化了下妆,并不影响后续的计算引用。
3、动态数据格式+自定义文本:
该方法是与单位相关的所有案例场景中的终极方案,它可以处理任意单位,而且也不影响度量值的后续计算引用。甚至不只是单位的场景,该方法也能应用到很多的场景中。
它借助动态数据格式来给度量值的返回结果化妆,或者说叫整容,因为该方案所返回的格式内容并不是格式字符串,而是一个完全自定义的文本,因此最终视觉呈现出来的内容可能并不代表度量值真正返回的内容,所以也不影响度量值的后续计算引用。
关于该终极方案的更多细节,可以阅读我的另一篇文章:PowerBI自定义数据标签与动态数据格式
解决方案
首先,数据模型如下图所示:
下面给出几种实现自适应单位的方法,具体如下:
方法一:使用FORMAT函数
Format1 =
VAR val = SUM('订单表'[销售额])
RETURN
SWITCH(
TRUE(),
val<1E3, FORMAT(val,"#,##0.0"), // 个位,无单位
val<1E4, FORMAT(val/1E3,"#,##0.0K"), // 千位,显示为K
val<1E6, FORMAT(val/1E4,"#,##0.0W"), // 万位,显示为W
val<1E9, FORMAT(val/1E6,"#,##0.0M"), // 百万,显示为M
FORMAT(val/1E9,"#,##0.0B") // 十亿,显示为B
)
方法二:使用动态数据格式
// Measure
Format2 = SUM('订单表'[销售额])
// Format
VAR val = SELECTEDMEASURE()
RETURN
SWITCH(
TRUE(),
val<1E3, "#,##0.0", // 个位,无单位
val<1E4, "#,##0,.0K", // 千位,显示为K
val<1E6, "#,##0\.0,.W", // 万位,显示为W
val<1E9, "#,##0,,.0M", // 百万,显示为M
"#,##0,,,.0B" // 十亿,显示为B
)
其中,动态数据格式的设置如下图所示:
方法三:动态数据格式+自定义文本
// Measure
Format3 = SUM('订单表'[销售额])
// Format
VAR val = SELECTEDMEASURE()
VAR val_Format =
SWITCH(
TRUE(),
val<1E3, FORMAT(val,"#,##0.0"), // 个位,无单位
val<1E4, FORMAT(val/1E3,"#,##0.0K"), // 千位,显示为K
val<1E6, FORMAT(val/1E4,"#,##0.0W"), // 万位,显示为W
val<1E9, FORMAT(val/1E6,"#,##0.0M"), // 百万,显示为M
FORMAT(val/1E9,"#,##0.0B") // 十亿,显示为B
)
RETURN
""""&val_Format&""""
最后创建一个矩阵,并将产品字段作为行标签,再将上面的度量值以及销售额字段一起放入矩阵的值字段即可,如下图所示:
总结
以上方法仅供参考,若有更优雅的解决方案,欢迎留言讨论,或者加入我们的技术交流群,一起享受这种思维碰撞的快乐吧!
PBI/DAX技术交流群(QQ):344353627