累计计算是一项常见需求,然而当数据存在重复值时,简单的累计方法可能会产生不准确的结果。本篇文章将探讨如何在PowerBI中正确处理重复值情况下的累计计算问题。
问题描述
为进行帕累托分析,现在需要计算各产品的销量累计(降序累计),请自行建模完成计算。
要求:
1、遇到重复值时需要能正确累计
2、保证总计正确。
本案例的初始数据如下:
销售表:
产品 | 销量 |
---|---|
A | 10 |
B | 10 |
C | 20 |
D | 20 |
E | 30 |
F | 40 |
G | 50 |
若需其它辅助表等,可自行创建并建模。
解题要点
当存在重复值时,想要正确计算连续的累计,一个重要的关键就是排除重复指标的影响,通常有以下几种方法:
1、在筛选出应累计数据的步骤时,引入不影响总体顺序的小数,使重复值变得不再重复,从而正确找出应累计数据。
2、在筛选出应累计数据的步骤时,引入另一个排序条件。
3、借助视觉计算函数或窗口函数来获取应累计数据。
解决方案
首先,数据模型如下图所示:
下面是存在重复值时的几种常见的累计计算方法,具体表达式如下:
1、引入不影响总体顺序的小数:
降序累计-1 =
VAR TempTbl = ADDCOLUMNS(ALLSELECTED('销售表'[产品]),"Sales",CALCULATE(SUM('销售表'[销量])))
VAR CurProduct = MAX('销售表'[产品])
VAR CurSales = IF(ISFILTERED('销售表'[产品]),SUM('销售表'[销量]))
RETURN
SUMX(
FILTER(
TempTbl,
[Sales]+1/UNICODE('销售表'[产品])>=CurSales+1/UNICODE(CurProduct)
),
[Sales]
)
2、引入另一个排序条件:
降序累计-2 =
VAR TempTbl = ADDCOLUMNS(ALLSELECTED('销售表'[产品]),"Sales",CALCULATE(SUM('销售表'[销量])))
VAR CurProduct = MAX('销售表'[产品])
VAR CurSales = IF(ISFILTERED('销售表'[产品]),SUM('销售表'[销量]))
RETURN
SUMX(
FILTER(
TempTbl,
[Sales]>CurSales || [Sales]=CurSales && '销售表'[产品]<=CurProduct
),
[Sales]
)
3、使用窗口函数:
降序累计-3 =
VAR TempTbl = ADDCOLUMNS(ALLSELECTED('销售表'[产品]),"Sales",CALCULATE(SUM('销售表'[销量])))
RETURN
SUMX(
WINDOW(1,ABS,0,TempTbl,ORDERBY([Sales],DESC)),
CALCULATE(SUM('销售表'[销量]))
)
4、使用视觉计算函数:
降序累计-4 = RUNNINGSUM([销量],ROWS,ORDERBY([销量],DESC))
其中,前三种方法用的都是度量值,而第四种方法则用的是视觉计算功能。
最后创建一个矩阵,并将产品字段作为行标签,再将上面的度量值、视觉计算表达式,以及销量字段一起放入矩阵的值字段即可,如下图所示:
另外,累计数据计算好之后,也可以适当的进行可视化,比如下图所示的帕累托图:
其中的累计占比指标,是使用前面计算好的累计度量值,然后将值显示方式设置为了占总计的百分比。
其他方案
以下解决方案精选自技术交流群中的其他小伙伴,希望他们的独到见解和解决思路能够为大家提供更多启发,内容已征得同意,特此分享出来供大家参考和借鉴。
1、一棵松:
2、WT:
3、XSY:
4、林深见鹿:
总结
以上方法仅供参考,若有更优雅的解决方案,欢迎留言讨论,或者加入我们的技术交流群,一起享受这种思维碰撞的快乐吧!
PBI/DAX技术交流群(QQ):344353627