人生没有彩排
每一天都是现场直播

当存在重复值时,如何在PowerBI中正确计算累计?

累计计算是一项常见需求,然而当数据存在重复值时,简单的累计方法可能会产生不准确的结果。本篇文章将探讨如何在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

赞(3) 打赏
未经允许不得转载:夕枫 » 当存在重复值时,如何在PowerBI中正确计算累计?
订阅评论
提醒
guest
2 评论
最新
最久 最赞
内联反馈
查看所有评论

觉得文章有用的话就支持一下吧~

感谢您的打赏支持,我将持续输出有价值的内容!

支付宝扫一扫打赏

微信扫一扫打赏