https://zhuanlan.zhihu.com/p/64418286

假设有一组数据,

已知每一个产品贡献的利润,如果要计算前几名产品的贡献利润总和,或者每一个产品和利润更高产品的累计贡献占总体的比例,就涉及到累计求和,数据量较小的情况下,在 Excel 中可以轻松实现,毕竟 Excel 是对单元格进行操作。

但是在 PowerBI 中,对整个字段运算很简单,而对每一行的数据进行筛选汇总,却需要动一点小心思,下面就以此表为例介绍几种常用的累计求和方式,并以此案例来进一步掌握几个函数的用法。

利用 M 函数累计求和

将该数据导入到 PQ 编辑器中,添加自定义列,

公式栏中输入M函数,

=List.Sum(Table.SelectRows(更改的类型,(x)=>x[利润]>=[利润])[利润])

然后就新增加了一列累计利润,

对这里的公式稍微解释一下,

Table.SelectRows 函数用来筛选表中符合条件的行,"更改的类型"是表的名称,在PQ编辑器中,每一个步骤就是一个表,步骤名就是该表的名称。

(x)=>x[利润]>=[利润]是筛选条件,这个相对比较难理解,还记得之前介绍的自定义函数吗,见到=>这个符号,就代表这里有个自定义函数,只是在这里是内置函数。意思为每一行为变量x,只要第x行的利润数大于等于当前行的利润,就利用 Table.SelectRows 函数把改行筛选出来。

而 Table.SelectRows 函数返回的是一个表,如果要提取该表中利润列,就是在该函数外面再加上字段名进行深化,于是就有了 Table.SelectRows(更改的类型,(x)=>x[利润]>=[利润])[利润],它返回的是符合条件的利润列。

最后再在最外面套上 List.Sum 函数对该列进行求和,就得到了以上表中累计利润。

利用 DAX 进行累计求和

在 DAX 中可以用 EARLIER 函数和 VAR 定义变量两种方式。

使用 EARLIER 函数

累计利润2 =
CALCULATE(SUM('产品'[利润]),
FILTER(ALL('产品'),'产品'[利润]>=EARLIER('产品'[利润])))

EARLIER函数以前专门介绍过,可以参考:EARLIER 函数 | PowerBI星球

使用VAR定义变量的方式累计求和

累计利润3 = VAR cur_profit='产品'[利润]

RETURN CALCULATE(SUM('产品'[利润]),
FILTER(ALL('产品'),'产品'[利润]>=cur_profit))

参考:采悟:DAX学习:使用VAR定义变量

这两种方式返回的结果和利用M函数的效果完全一致,

这两种函数,其实和上面M函数一样,都是通过各自的方式筛选符合大于等于当前利润的数据行,然后求和得到结果。

上面的DAX求和用到的是CALCULATE,其实这里也可以用SUMX函数,

累计利润4 = SUMX(filter(all('产品'),'产品'[利润]>=EARLIER('产品'[利润])),'产品'[利润])

累计利润5 = VAR cur_profit='产品'[利润]
RETURN SUMX(FILTER(ALL('产品'),'产品'[利润]>=cur_profit),'产品'[利润])

CALCULATE函数第一个参数是汇总方式,第二个及之后的参数为筛选条件,而SUMX函数第一个参数筛选条件,第二个参数为求和字段,在求和的计算上,SUMX可以实现和CALCULATE一样的效果。

案例中的数据已经按照利润从大到小进行排列,理解上更直观,其实即使不进行排序,这几种方式也都可以返回正确的结果,因为计算的逻辑和每一行的顺序无关。

上面几个公式,需要的时候可以随时套用,当然在理解的基础上灵活掌握这些函数,可以更有效的进行各种数据分析。累计求和在数据分析中十分常用,比如ABC分析,后面会进一步介绍。

数据可视化之DAX篇(十)在PowerBI中累计求和的两种方式的更多相关文章

  1. 数据可视化之DAX篇(二十八)Power BI时间序列分析用到的度量值,一次全给你

    https://zhuanlan.zhihu.com/p/88528732 在各种经营分析报告中,我们常常会看到YTD,YOY这样的统计指标,这样的数据计算并不难,尤其是在PowerBI中,因为有时间 ...

  2. 数据可视化之DAX篇(二)Power BI中的度量值和计算列,你搞清楚了吗?

    https://zhuanlan.zhihu.com/p/75462046 对于初学者,总是会把度量值和计算列搞混,我也经常碰到这样的问题,有些星友用文章中的代码总是报错,发给我一看,才知道TA把本来 ...

  3. 数据可视化之DAX篇(九) 关于DAX中的VAR,你应该避免的一个常见错误

    https://zhuanlan.zhihu.com/p/67803111 本文源于微博上一位朋友的问题,在计算同比增长率时,以下两种DAX代码有什么不同? -------------------- ...

  4. 数据可视化之DAX篇(八) DAX学习:使用VAR定义变量

    https://zhuanlan.zhihu.com/p/64414205 前面介绍如何使用DAX生成日期表的时候,使用了VAR,有人留言问这个VAR怎么理解,那么这篇文章就来介绍VAR以及它的用法. ...

  5. 数据可视化之DAX篇(二十五)PowerBI常用的度量值:累计至今

    https://zhuanlan.zhihu.com/p/64999937 经常碰到本年至今.本月至今的数据计算,其实还有一类计算是,从历史最早日期至今的累计计算,比如从开业到现在总共卖出了多少件商品 ...

  6. 数据可视化之DAX篇(五) 使用PowerBI的这两个函数,灵活计算各种占比

    https://zhuanlan.zhihu.com/p/57861350 计算个体占总体的比例是一个很常见的分析方式,它很简单,就是两个数字相除,但是当需要计算的维度.总体的范围发生动态变化时,如何 ...

  7. 数据可视化之DAX篇(十五)Power BI按表筛选的思路

    https://zhuanlan.zhihu.com/p/121773967 ​数据分析就是筛选.分组.聚合的过程,关于筛选,可以按一个维度来筛选,也可以按多个维度筛选,还有种常见的方式是,利用几个特 ...

  8. 数据可视化之DAX篇(十二)掌握时间智能函数,同比环比各种比,轻松搞定!

    https://zhuanlan.zhihu.com/p/55841964 时间可以说是数据分析中最常用的独立变量,工作中也常常会遇到对时间数据的对比分析.假设要计算上年同期的销量,在PowerBI中 ...

  9. 数据可视化之DAX篇(二十四)Power BI应用技巧:在总计行实现条件格式

    https://zhuanlan.zhihu.com/p/98975646 如何将表格或者矩阵中值的条件格式也应用于总计行? 目前PowerBI并不支持这种功能,无法在总计行或者小计行上应用条件格式, ...

随机推荐

  1. @codechef - JADUGAR2@ Chef and Same Old Recurrence 2

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 定义 dp 序列: \[dp(1) = K\\ dp(n) = ...

  2. 关于微信小程序的文档-手撸

    学习小程序的人如果有vue基础的话应该有很好的帮助作用.没有也关系,反正很简单. 首先理解一个完整的小程序app都有什么页面: pages页面放置所有的页面文件. 一个完整的小程序页面文件包括: in ...

  3. foreach 集合又抛经典异常了,这次一定要刨根问底

    一:背景 1. 讲故事 最近同事在写一段业务逻辑的时候,程序跑起来总是报:集合已修改:可能无法执行枚举操作,硬是没有找到什么情况下会导致这个异常产生,就让我来找一下bug,其实这个异常在座的每个程序员 ...

  4. 授权函数-web_set_user

    为Web服务器指定登录字符串.当我们使用RNS服务器或者某些服务器的时候需要我们输入账号密码登录才能给进行访问,那么这个时候就需要用到该函数 int web_set_user(const char* ...

  5. MySQL的分页存储过程

    -- 创建分页存储过程-- 1 判断存在即删除DROP PROCEDURE IF EXISTS popp;-- 2 创建万能分页CREATE  PROCEDURE popp(_fls VARCHAR( ...

  6. 谈谈java中的并发(一)

    一.并发的定义 并发:对于这个概念一直就是没怎么搞懂,就是感觉特别的生疏,(自己从从字面上理解就是多个东西,一起出发),所以就上网上查了一些资料: 同时拥有两个或多个线程,如果程序在单核处理器上运行, ...

  7. 05、MyBatis 缓存

    1.MyBatis缓存 MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制.缓存可以极大的提升查询效率. 1).一级缓存 public Employee getEmpById( ...

  8. skywalking7 源码解析 (3) :agent启动服务分析以及性能影响

    skywalking必看的文章,转载自https://blog.csdn.net/u010928589/article/details/106608864/

  9. 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  10. IDEA创建SpringBoot的多模块项目教程

    最近在写一个多模块的SpringBoot项目,基于过程总了一些总结,故把SpringBoot多个模块的项目创建记录下来. 首先,先建立一个父工程: (1)在IDEA工具栏选择File->New- ...