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

累计计算是一项常见需求,然而当数据存在重复值时,简单的累计方法可能会产生不准确的结果。本篇文章将探讨如何在PowerBI中正确处理重复值情况下的累计计算问题。

问题描述

为进行帕累托分析,现在需要计算各产品的销量累计(降序累计),请自行建模完成计算。

要求:

1、遇到重复值时需要能正确累计

2、保证总计正确。

本案例的初始数据如下:

销售表:

产品销量
A10
B10
C20
D20
E30
F40
G50

若需其它辅助表等,可自行创建并建模。

解题要点

当存在重复值时,想要正确计算连续的累计,一个重要的关键就是排除重复指标的影响,通常有以下几种方法:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PowerBI | 夕枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值