Power BI之DAX神功:第4卷第21回 GROUPBY函數(shù)與SUMMARIZE的區(qū)別
一、先體驗(yàn)一下GROUPBY
語(yǔ)法:GROUPBY(表,按哪個(gè)列分組,新列名,生成新列的表達(dá)式)
// 前2個(gè)參數(shù)是必需的,后2個(gè)參數(shù)可選,后3個(gè)參數(shù)可重復(fù)

GROUPBY僅憑前兩參數(shù)就可以生成一張表,如果我想對(duì)生成的這張表做點(diǎn)什么,例如:張三、李四、王五的平均分,例如2020、2021年AB商品總銷量與總銷售
【1】CURRENTGROUP函數(shù)
CURRENTGROUP 只能用于 GROUPBY 函數(shù)中生成新列的表達(dá)式中使用,無參數(shù)。
CURRENTGROUP()就代表GROUPBY前兩參數(shù)生成的那張表。
當(dāng)我們對(duì)這張表操作時(shí)只能迭代這張表,要使用X系列的迭代函數(shù),例如:SumX、AverageX、MaxX等等
【2】對(duì)單列分組

返回結(jié)果

【3】對(duì)多列分組

返回結(jié)果:

【4】你的疑問
這個(gè)功能矩陣就可以實(shí)現(xiàn),為什么要這么麻煩新建表呢?
因?yàn)檫@個(gè)表不是直接拿來用的,將做為參數(shù)嵌套在其它函數(shù)中使用。
二、AddColumns+Summarize也可以實(shí)現(xiàn)
我們以Sheet2為列:
返回結(jié)果:

是不是與GROUPBY函數(shù)生成的表一樣?

現(xiàn)在我們對(duì)SUMMARIZE函數(shù)生成的表添加列就可以了:
Ps: 也可以將calculatetable函數(shù)替換成RELATEDTABLE函數(shù),詳見《DAX神功》第2卷第2回
返回結(jié)果:

三、GROUPBY與SUMMARIZE函數(shù)比較
【1】GROUPBY與SUMMARIZE都對(duì)第1參數(shù)擴(kuò)展表執(zhí)行分組
可以使用擴(kuò)展表中包含的任何列做分組參數(shù)。例如下圖,通過店號(hào)建立一對(duì)多關(guān)系
擴(kuò)展表原理詳見《DAX神功》第3卷第12回

返回結(jié)果:

【2】summarize可轉(zhuǎn)換上下文,而GROUPBY只是迭代表
用summarize或Addcolumns新增加的列,又名派生列。
原表中沒有的列叫派生列,原表中有的列叫原生列。
雖然我們沒有提到這個(gè)名詞,但是新增列的工作我們經(jīng)常在做,關(guān)于派生列(新增列)數(shù)據(jù)沿襲問題,我們也在《DAX神功》第2卷第21回中做了詳細(xì)講解。

但是這樣操作會(huì)降低速度,我們平時(shí)很少在Summarize中直接新建派生列,而是使用AddColumns+Summarize方式提高速度,但是AddColumns要使用Calculate實(shí)現(xiàn)篩選。因?yàn)閟ummarize本身可轉(zhuǎn)換上下文。
反觀,GROUPBY只是通過 CURRENTGROUP 函數(shù)對(duì)分組后的每一行進(jìn)行迭代。
【3】性能警告
GROUPBY會(huì)影響性能,主要取決于列的基數(shù),如果列基數(shù)比較大,不建議使用GROUPBY函數(shù),就是說有100萬(wàn)行數(shù)據(jù)不可怕,分組后就是張三、李四,那是OK的??膳碌氖欠纸M后有30萬(wàn)人,這時(shí)我建議還是別用了,等將來PC性能提高了你使用速度慢的可能也不明顯了。
關(guān)于列基數(shù),請(qǐng)?jiān)斠?span id="s0sssss00s" class="color-green-04">《DAX神功》第4卷第9回
四、GROUPBY 可以用于對(duì)派生列分組聚合
在上面我們講到了AddColumns和Summarize都可以生成派生列,Groupby的優(yōu)勢(shì)是對(duì)派生列再分組。如下表,學(xué)號(hào)之間建立一對(duì)多關(guān)系

【1】先通過summarize分組

【2】通過Addcolumns新建派生列

【3】如果我對(duì)評(píng)價(jià)列再分組,求及格與不及格的平均分
以下兩種寫法都是錯(cuò)誤的!
出錯(cuò)理由都是找不到[平均分]這個(gè)列,因?yàn)閇平均分]本身就是派生列。這時(shí)使用GROUPBY就可以了。神奇吧!
返回結(jié)果:

五、GROUPBY 空行和空值問題
如下表所示,通過學(xué)號(hào)建立關(guān)系:

【1】因?yàn)橐粚?duì)多關(guān)系不符合實(shí)時(shí)參照完成性產(chǎn)生的空行
例如,1端表主鍵元素個(gè)數(shù)小于多端表外鍵元素個(gè)數(shù),這時(shí)必然會(huì)產(chǎn)生空行,可以通過filter篩選掉空行。
返回結(jié)果:

去掉空行:
返回結(jié)果:

【2】因?yàn)楹Y選產(chǎn)生的空值【小心分母問題】
當(dāng)分?jǐn)?shù)不到60分時(shí),不參加求平均,這時(shí),A和C同學(xué)只有一科成績(jī),B同學(xué)因?yàn)閮煽贫疾蛔?0分所以返回空。

我們《火力全開》第12課?講IF函數(shù)時(shí),提到第三參數(shù)省略時(shí),他返回Blank()

返回結(jié)果:

友情提示:這時(shí)你千萬(wàn)別聽從國(guó)外文獻(xiàn)上翻譯過來的文章上面提到的方法,將第3參數(shù)改成0,這是一個(gè)小學(xué)知識(shí)。
if('成績(jī)表'[分?jǐn)?shù)]>60,'成績(jī)表'[分?jǐn)?shù)])? // 凡是不滿60分的成績(jī)不參加平均分計(jì)算,分母減少。
if('成績(jī)表'[分?jǐn)?shù)]>60,'成績(jī)表'[分?jǐn)?shù)],0) // 凡是不滿60分的成績(jī)當(dāng)成0來參加平均分計(jì)算?,分母不減少。
返回結(jié)果:因?yàn)榉帜笡]有減少,返回Blank()時(shí)原本是77和88,現(xiàn)在變成了77/2=38.5、88/2=44

《孫興華講PowerBI火力全開》PowerBI必學(xué)課程
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函數(shù))、PowerQuery(M函數(shù))、Python辦公自動(dòng)化、Python爬蟲、Python數(shù)據(jù)分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等
https://www.bilibili.com/read/cv10222110