Power BI之DAX神功:第4卷第21回 GROUPBY函数与SUMMARIZE的区别
一、先体验一下GROUPBY
语法:GROUPBY(表,按哪个列分组,新列名,生成新列的表达式)
// 前2个参数是必需的,后2个参数可选,后3个参数可重复

GROUPBY仅凭前两参数就可以生成一张表,如果我想对生成的这张表做点什么,例如:张三、李四、王五的平均分,例如2020、2021年AB商品总销量与总销售
【1】CURRENTGROUP函数
CURRENTGROUP 只能用于 GROUPBY 函数中生成新列的表达式中使用,无参数。
CURRENTGROUP()就代表GROUPBY前两参数生成的那张表。
当我们对这张表操作时只能迭代这张表,要使用X系列的迭代函数,例如:SumX、AverageX、MaxX等等
【2】对单列分组

返回结果

【3】对多列分组

返回结果:

【4】你的疑问
这个功能矩阵就可以实现,为什么要这么麻烦新建表呢?
因为这个表不是直接拿来用的,将做为参数嵌套在其它函数中使用。
二、AddColumns+Summarize也可以实现
我们以Sheet2为列:
返回结果:

是不是与GROUPBY函数生成的表一样?

现在我们对SUMMARIZE函数生成的表添加列就可以了:
Ps: 也可以将calculatetable函数替换成RELATEDTABLE函数,详见《DAX神功》第2卷第2回
返回结果:

三、GROUPBY与SUMMARIZE函数比较
【1】GROUPBY与SUMMARIZE都对第1参数扩展表执行分组
可以使用扩展表中包含的任何列做分组参数。例如下图,通过店号建立一对多关系
扩展表原理详见《DAX神功》第3卷第12回

返回结果:

【2】summarize可转换上下文,而GROUPBY只是迭代表
用summarize或Addcolumns新增加的列,又名派生列。
原表中没有的列叫派生列,原表中有的列叫原生列。
虽然我们没有提到这个名词,但是新增列的工作我们经常在做,关于派生列(新增列)数据沿袭问题,我们也在《DAX神功》第2卷第21回中做了详细讲解。

但是这样操作会降低速度,我们平时很少在Summarize中直接新建派生列,而是使用AddColumns+Summarize方式提高速度,但是AddColumns要使用Calculate实现筛选。因为summarize本身可转换上下文。
反观,GROUPBY只是通过 CURRENTGROUP 函数对分组后的每一行进行迭代。
【3】性能警告
GROUPBY会影响性能,主要取决于列的基数,如果列基数比较大,不建议使用GROUPBY函数,就是说有100万行数据不可怕,分组后就是张三、李四,那是OK的。可怕的是分组后有30万人,这时我建议还是别用了,等将来PC性能提高了你使用速度慢的可能也不明显了。
关于列基数,请详见《DAX神功》第4卷第9回
四、GROUPBY 可以用于对派生列分组聚合
在上面我们讲到了AddColumns和Summarize都可以生成派生列,Groupby的优势是对派生列再分组。如下表,学号之间建立一对多关系

【1】先通过summarize分组

【2】通过Addcolumns新建派生列

【3】如果我对评价列再分组,求及格与不及格的平均分
以下两种写法都是错误的!
出错理由都是找不到[平均分]这个列,因为[平均分]本身就是派生列。这时使用GROUPBY就可以了。神奇吧!
返回结果:

五、GROUPBY 空行和空值问题
如下表所示,通过学号建立关系:

【1】因为一对多关系不符合实时参照完成性产生的空行
例如,1端表主键元素个数小于多端表外键元素个数,这时必然会产生空行,可以通过filter筛选掉空行。
返回结果:

去掉空行:
返回结果:

【2】因为筛选产生的空值【小心分母问题】
当分数不到60分时,不参加求平均,这时,A和C同学只有一科成绩,B同学因为两科都不足60分所以返回空。

我们《火力全开》第12课 讲IF函数时,提到第三参数省略时,他返回Blank()

返回结果:

友情提示:这时你千万别听从国外文献上翻译过来的文章上面提到的方法,将第3参数改成0,这是一个小学知识。
if('成绩表'[分数]>60,'成绩表'[分数]) // 凡是不满60分的成绩不参加平均分计算,分母减少。
if('成绩表'[分数]>60,'成绩表'[分数],0) // 凡是不满60分的成绩当成0来参加平均分计算 ,分母不减少。
返回结果:因为分母没有减少,返回Blank()时原本是77和88,现在变成了77/2=38.5、88/2=44

《孙兴华讲PowerBI火力全开》PowerBI必学课程
https://www.bilibili.com/video/BV1qa4y1H7wp
《DAX神功》文字版合集:
https://www.bilibili.com/read/readlist/rl442274
《DAX神功》视频版合集:
https://www.bilibili.com/video/BV1YE411E7p3
《DAX神功番外篇》文字版合集:
https://www.bilibili.com/read/readlist/rl478271
PowerBI(DAX函数)、PowerQuery(M函数)、Python办公自动化、Python爬虫、Python数据分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等