小伙伴,大家好!今天给大家分享的是一个会员朋友的提问,他想在Power BI里面绘制帕累托图,但是,遇到一个比较奇怪的问题:多个产品的销售额都一样,这样我们在计算累计判断的逻辑就有点问题了,这个并不是DAX计算错误,只是计算逻辑不符合我们的需求而已。
首先,我们看下正常情况下的表达式写法和实现后的效果。x轴代表的是不同的产品,左侧y轴代表的是对应产品的销售额,右侧y轴代表的是对应产品之前(含当前产品)销售额累计占整个销售额的比例。一般来说,我们可以通过这个分析来看公司哪些产品是核心产品,哪些是次核心,具体方法可以参考我之前的文章(PowerBI如何实现产品的ABC分析)很明显,如果我们想知道哪些产品贡献了企业里80%的销售额,这里我们可以很清晰的定位到耳机——滑雪板的销售额合计贡献企业80%的份额,换句话说,这部分产品是公司的核心产品。
累计占比%=VAR curSales = [salesAmt]//获取当前筛选上下文(这里是产品)的销售额VAR cumSales =//计算累计销售额,计算逻辑是,凡是比我当前销售额大的值,都累计计算,实现关键点是ALL取消了产品的外部筛选上下文。CALCULATE ([salesAmt],FILTER ( ALL ( 't1'[销售产品] ), 't1'[salesAmt] >= curSales ))VAR allSales =//返回所有产品的销售额。CALCULATE ( [salesAmt], ALL ( 't1'[销售产品] ) )RETURNDIVIDE ( cumSales, allSales )


理想很丰满,现实很骨感,你以为实际的分析就是这么简单么。答案很明显是NO,接下来就有坑出现了,先看截图。如果出现某些产品的销售额都是一样的,这时候如果还是按照上面的写法就会有问题,大家可以看下截图中红色框内的内容,度量值销售额累计占比(1)就重复三次出现同样的值,具体原因也就是我们表达式的逻辑是计算大于等于当前值的所有产品销售额的累计,三个值是相等的,所以导致三个产品的累计值是一样的。为了避免这个问题,有几种方法来实现,第(1)种:通过新建列,使用rand函数构成随机小数再加上销售额,实现构建产品销售额的差异。这个方法可以继续使用上述表达式;第(2)种方法:就是我现在介绍的方式。可以新增索引列来实现。两种方式本质上都是构建差异判断,具体可以参考下面的表达式。下面图(1)中的销售额累计占比(2)就是使用这个表达式后的效果。
累计占比2 =VAR curSales = [salesAmt2]//当前筛选上下文下的销售额VAR curIndex = SELECTEDVALUE(t2[索引])//获取当前的索引值VAR cumSales =CALCULATE ([salesAmt2],FILTER ( ALL ( 't2'), [salesAmt2] > curSales || ([salesAmt2]=curSales&&'t2'[索引]<=curIndex)))//满足两种情况:1.大于当前的销售额的时候,直接满足条件累积,当销售额与当前行一样的时候,根据索引来判断。VAR allSales =CALCULATE ( [salesAmt2], ALL ( 't2' ) )//整体销售额RETURNDIVIDE(cumSales,allSales)


PowerHome平台主要分享Excel、Power BI、Tableau、SQL等职场数据分析工具技巧,如果觉得小编的内容不错,非常感谢您能够点个在看或者分享给更多需要的朋友。如果需要学习可以通过添加小编的私信交流(18923468365) 以下内容均有系统学习课程,如需学习可以私聊小编哦!1.Excel商务图表、公式函数、VBA、数据透视表 2.Power BI、Power Query、Tableau商务智能分析软件 3.数据分析实战服务:(1)训练营打卡学习(2)专属社群交流(3)学习资源共享(4)专属答疑服务
演示案例获取:扫描二维码,私聊小编





