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

SUMMARIZE函数非常强大,掌握以后表面上看也非常好用,所以我专门写篇文章介绍一下这个函数,至于是否一定要使用该函数,请看完再决定。


SUMMARIZE,单纯从英文语义上看,是汇总、总结的意思,而它的功能,确实也就是汇总,它可以返回一个汇总表。

你可以从官方的文档中查询到该函数的说明,

https://docs.microsoft.com/en-us/dax/summarize-function-dax

它的参数非常复杂和难以理解,参数很多,并且有些参数都是可选的、可重复的。直接靠文档不容易理解,我们可以根据实例来理解它的用法。

它的参数很多是可选的,让我们按参数由少到多逐步看看它的功能。

01 | 提取不重复值

以下表达式,会提取不重复的产品名称:

维度表1 = SUMMARIZE('订单','订单'[产品名称])

SUMMARIZE函数的第一个参数是表,第二个参数是列时,会返回该列的不重复列表,其功能与VALUES相似。

不过SUMMARIZE函数还可以继续添加第三个、第四个参数列…,看以下表达式的返回结果,

维度表2 = SUMMARIZE('订单','订单'[产品名称],'日期表'[年度])

SUMMARIZE参数表后面跟多个列时,它会返回这些列的有效组合,类似于笛卡尔积,与笛卡尔积稍微不同的是,如果在订单表中不存在这个组合,则返回的列表中,就不会出现这一行。

举个例子,假如2016年如果没有卖过智能手表,则上述的表达式不会有2016 智能手表这一行。

02 | 返回汇总表

在上述表达式的基础上,我们继续添加参数如下:

汇总表1 =
SUMMARIZE(
'订单',
'日期表'[年度],
'订单'[产品名称],
"销售额合计",SUM('订单'[销售额])
)

SUMMARIZE参数后面带上列名和表达式时,它会自动计算并返回分组的汇总表,这才是该函数的本质功能,也切合它的字面意义。

这个功能非常好用,也是我们使用它最普遍的地方。

03 | 返回带合计的汇总表

这是SUMMARIZE的高级功能,在上面的表达式中的分组列外面套一层ROLLUP,看看是什么效果?

汇总表2 =
SUMMARIZE(
'订单',
ROLLUP('日期表'[年度],'订单'[产品名称]),
"销售额合计",SUM('订单'[销售额])
)

看到在汇总表的下面还多了几行合计数,这就是ROLLUP参数的作用。它只在SUMMARIZE内部使用,用于为子类别计算小计和总计。

SUMMARIZE内部还可以使用一个参数是ROLLUPGROUP,使用ROLLUPGROUP代替上面表达式中的ROLLUP,可以返回相同的结果。

不过如果在上面表达式ROLLUP里面再套一层ROLLUPGROUP,

汇总表3 =
SUMMARIZE(
'订单',
ROLLUP(ROLLUPGROUP('日期表'[年度],'订单'[产品名称])),
"销售额合计",SUM('订单'[销售额])
)

分组的小计不见了,只返回了总计, ROLLUP和ROLLUPGROUP组合可以避免出现小计,而只返回总计。这样使汇总表看起来更像是Excel中的透视表。

关于ROLLUP和ROLLUPGROUP参数,其实它们的合计功能并不常用,但是却导致很多人觉得SUMMARIZE很复杂,你如果也是这种感觉,完全可以不用深究这两个参数的用法,因为你基本上也不会用到它们。


SUMMARIZE最常用的还是上面的第二种功能,让我们回头再来看看这种用法,返回一个汇总表确实非常实用,但是这是最优的写法吗?

使用ADDCOLUMNS返回汇总表

02示例中的表达式,还可以用以下表达式代替,

汇总表4 =
ADDCOLUMNS(
SUMMARIZE(
'订单',
‘日期表'[年度],
'订单'[产品名称]
),
"销售额合计",CALCULATE(SUM('订单'[销售额]))
)

即通过ADDCOLUMNS函数,在SUMMARIZE生成分组的基础上添加列,来计算销售额汇总,可以返回相同的结果,但是在性能上,要比单纯的使用SUMMARIZE更优。

SUMMARIZE函数由于性能和内部兼容性等方面的原因,并不建议使用它来进行汇总,可以使用上面的ADDCOLUMNS和SUMMARIZE组合来代替,另外还有个新函数性能更优:SUMMARIZECOLUMNS。

使用SUMMARIZECOLUMNS返回汇总表

依然是生成上面的汇总表,SUMMARIZECOLUMNS的写法:

汇总表5 =
SUMMARIZECOLUMNS(
'日期表'[年度],
'订单'[产品名称],
"销售额合计",CALCULATE(SUM('订单'[销售额]))
)

是不是看起来更加简洁,它的第一个参数不再需要表,而是直接是分组列,实践上看,它的性能要优于ADDCOLUMNS和SUMMARIZE组合,当然也远优于SUMMARIZE,生成汇总表时建议直接用SUMMARIZECOLUMNS(关于性能,你可以使用DAX Studio进行测试)。

SUMMARIZECOLUMNS应该就是为了替代SUMMARIZE而出现的,它可以实现SUMMARIZE的功能;SUMMARIZE的内部参数,比如ROLLUPGROUP等,SUMMARIZECOLUMNS同样也有,并且还有更多其他内部参数可以调用,不过对于普通DAX使用者来说,可能并不会使用到,就不再介绍了,想深入理解的请自行查阅该函数文档。

总结

    • 提取多列的有效组合时,可以使用SUMMARIZE
    • 返回汇总表时,推荐使用SUMMARIZECOLUMNS

数据可视化之DAX篇(十九)值得你深入了解的函数:SUMMARIZE的更多相关文章

  1. 数据可视化之DAX篇(一)Power BI时间智能函数如何处理2月29日的?

    https://zhuanlan.zhihu.com/p/109964336 ​今年是闰年,有星友问我,在Power BI中,2月29日的上年同期是怎么计算的? 这是个好问题,正好梳理一下,Power ...

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

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

  3. 数据可视化之DAX篇(十六)如何快速理解一个复杂的DAX?这个方法告诉你

    https://zhuanlan.zhihu.com/p/64422393 经常有朋友提出一个问题,然后我给出一个DAX之后,TA又不是很理解,反复多次沟通才能把一个表达式讲清楚.或者TA自己写了一个 ...

  4. 数据可视化之DAX篇(十)在PowerBI中累计求和的两种方式

    https://zhuanlan.zhihu.com/p/64418286 假设有一组数据, 已知每一个产品贡献的利润,如果要计算前几名产品的贡献利润总和,或者每一个产品和利润更高产品的累计贡献占总体 ...

  5. 数据可视化之DAX篇(二十)Think in DAX 之报表自动化实践

    https://zhuanlan.zhihu.com/p/107672198 ​本文来自星友袁佳林的实践分享,他参加了PowerBI星球中的DAX圣经第二版100天学习打卡活动,已持续分享近100天, ...

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

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

  7. 数据可视化之DAX篇(十四)DAX函数:RELATED和RELATEDTABLE

    https://zhuanlan.zhihu.com/p/64421378 Excel中知名度最高的函数当属VLOOKUP,它的确很有用,可以在两个表之间进行匹配数据,使工作效率大大提升,虽然它也有很 ...

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

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

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

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

随机推荐

  1. Serval and Parenthesis Sequence【思维】

    Serval and Parenthesis Sequence 题目链接(点击) Serval soon said goodbye to Japari kindergarten, and began ...

  2. LaTeX实时预览中文

    参考资料:http://blog.sina.com.cn/s/blog_6ea58f530101aizw.html 功夫不负有心人,终于在经过艰苦卓绝的寻找之后,让我的Texpad实现了实时预览.此时 ...

  3. docsify 如何写博客

    1. 安装node 下载安装即可: https://nodejs.org/zh-cn/ 下载文件: https://nodejs.org/dist/v12.16.1/node-v12.16.1-x64 ...

  4. 【初学Java学习笔记】SQL语句调优

    1, 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2,应尽量避免在 where 子句中对字段进行 null 值判断,创建表时NULL是默认 ...

  5. skywalking与pinpoint全链路追踪方案对比

    由于公司目前有200多微服务,微服务之间的调用关系错综复杂,调用关系人工维护基本不可能实现,需要调研一套全链路追踪方案,初步调研之后选取了skywalking和pinpoint进行对比; 选取skyw ...

  6. NET 数据结构-单链表

    概念介绍: 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素. 链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元 ...

  7. TCP协议粘包问题详解

    TCP协议粘包问题详解 前言 在本章节中,我们将探讨TCP协议基于流式传输的最大一个问题,即粘包问题.本章主要介绍TCP粘包的原理与其三种解决粘包的方案.并且还会介绍为什么UDP协议不会产生粘包. 基 ...

  8. keras中loss与val_loss的关系

    loss是训练集的损失值,val_loss是测试集的损失值 以下是loss与val_loss的变化反映出训练走向的规律总结: train loss 不断下降,test loss不断下降,说明网络仍在学 ...

  9. stm32存储器映像和标准库中定义外设地址的方法

    结合存储器映像理解stm32标准库中定义外设地址的方法. stm32f103zet6是32位的.它所能访问的地址空间范围为2^32=4GB,把4GB分为8个block,分别为block0-block- ...

  10. 基于AOP和ThreadLocal实现日志记录

    基于AOP和ThreadLocal实现的一个日志记录的例子 主要功能实现 : 在API每次被请求时,可以在整个方法调用链路中记录一条唯一的API请求日志,可以记录请求中绝大部分关键内容.并且可以自定义 ...