Power BI之DAX神功:第3卷第3回 CALCULATETABLE與FILTER函數(shù)的區(qū)別
一、Calculatetable與Calculate只是返回結(jié)果不同

【度量值】總銷售 = SUM(Sheet1[銷售])
【度量值】男生成績 = CALCULATE([總銷售],'Sheet1'[性別]="男")

【新建表】男生成績的表 = CALCULATETABLE('Sheet1','Sheet1'[性別]="男")

總結(jié):Calculate返回的是一個值,Calculatetable返回一張表。除此之外,Calculatetable繼承了Calculate幾乎所有能力,其中包含對上下文轉(zhuǎn)換的功能。
例如:sumx生成行上下文,套上Calculate后被轉(zhuǎn)換成篩選上下文。Calculatetable也可以進(jìn)行上下文轉(zhuǎn)換。
二、Calculatetable與filter的區(qū)別
我們?yōu)镾heet1這張表增加一行,與第1行重復(fù)的:張三,男,1

【新建表】男生成績的表1 = CALCULATETABLE('Sheet1','Sheet1'[性別]="男")
【新建表】男生成績的表2 = FILTER('Sheet1','Sheet1'[性別]="男")

表面上看二者在結(jié)果上是一樣的,只是在這種情況下結(jié)果相同,我們看看不同情況
區(qū)別1:使用ALL表對Calculatetable的影響
我們以all函數(shù)為例,它既是表函數(shù)又是Calculate的調(diào)節(jié)器,剛才我們說了Calculatetable只是結(jié)果返回表,它繼承了Calculate幾乎所有的功能。
all函數(shù)在Filter中使用時,它是表函數(shù),在Calculate或Calculatetable中使用時是調(diào)節(jié)器
【新建表】表1 = FILTER(all('Sheet1'),'Sheet1'[性別]="男")
// all(表)就是復(fù)制這張表,?filter中使用all不會影響篩選,《DAX神功》第2卷第3回 計算移動平均值再次理解Filter+ALL 已經(jīng)得到了證明

【新建表】表2 = CALCULATETABLE(all('Sheet1'),'Sheet1'[性別]="男")
// 但是當(dāng)ALL放在Calculate或Calculatetable引擎中,ALL是調(diào)節(jié)器的作用,表2的意思是篩選男生并返回Sheet1這張表的所有行。等于沒篩選,結(jié)果返回的是Sheet1表中的所有行

區(qū)別2:使用ALL列注意去重和能否使用的問題
【新建表】表3 = FILTER(all(Sheet1[姓名]),'Sheet1'[性別]="男")
// all(Sheet1[姓名])是取姓名去重后的表,這張表中沒有性別列,所以無法篩選。

但是列名相同時可以使用
【新建表】表3 = FILTER(all(Sheet1[姓名]),'Sheet1'[姓名] in {"張三","王五"})

【新建表】表4 = CALCULATETABLE(all('Sheet1'[姓名]),'Sheet1'[性別]="男")
// 使用Calculatetable就可以這樣篩選(如果想得到正確結(jié)果去掉all函數(shù)改用Values或DISTINCT),原理:Calculate(計算器,篩選器)先執(zhí)行篩選器再執(zhí)行計算器,Calculatetable除了結(jié)果是表以外繼承了Calculate幾乎所有的功能,所以Calculatetable也是先執(zhí)行篩選器,后執(zhí)行計算器。先在Sheet1表中篩選所有男生的表,再取Sheet1表中姓名列去重后的表所有行。(等于篩選沒生效,因為all返回去重后的所有行)

想實現(xiàn)對男生的篩選結(jié)果,換用VALUES或DISTINCT
// 《DAX神功》第1卷第9回 詳細(xì)講解了Values或DISTINCT的區(qū)別
【新建表】表4 = CALCULATETABLE(VALUES('Sheet1'[姓名]),'Sheet1'[性別]="男")
【新建表】表4 = CALCULATETABLE(DISTINCT('Sheet1'[姓名]),'Sheet1'[性別]="男")

區(qū)別3:calculatetable與filter計值順序與上下文轉(zhuǎn)換
我們先使用ADDColumns對Sheet1添加列
《DAX神功》答網(wǎng)友問05 返回表的迭代函數(shù)你應(yīng)該注意什么?我們講解了ADDCOLUMNS與SELECTCOLUMNS的區(qū)別
ADDCOLUMNS相當(dāng)于整容,例如你長了兩只眼睛,整容可以讓你變成3只,但你還是你。
SELECTCOLUMNS相當(dāng)于克隆再整容,克隆你再整容成3只眼,長的一樣,但是那不是你。
【新建表】測試 = ADDColumns('Sheet1',"數(shù)量",CountRows('Sheet1'))
//?CountRows('Sheet1')返回4,在Sheet1中新建一個列,每一行都賦值為4

【新建表】表5 = FILTER(ADDColumns('Sheet1',"數(shù)量",CountRows('Sheet1')),'Sheet1'[性別]="男")
// filter生成的是行上下文,所以每一行顯示的都是CountRows('Sheet1')生成的值:4

Filter計算順序:

【新建表】表6 = CALCULATETABLE(ADDColumns('Sheet1',"數(shù)量",CountRows('Sheet1')),'Sheet1'[性別]="男")
//?CALCULATETABLE除了結(jié)果返回表外,幾乎繼承了calculate所有功能,它具備將行上下文轉(zhuǎn)換成篩選上下文的功能,所以每一行的CountRows('Sheet1')返回的是篩選后表中有多少行。

CALCULATETABLE計值順序:

如果我們想實現(xiàn)內(nèi)部的CountRows實現(xiàn)篩選功能:
根據(jù)《DAX神功》第1卷第19回?獨創(chuàng)的"母子關(guān)系"
我們講了下面sumx創(chuàng)建行上下文,寫在度量值中,就相當(dāng)于外面套上了Calculate實現(xiàn)了上下文轉(zhuǎn)換功能,但是他內(nèi)層的sum還是行上下文,無法換轉(zhuǎn),如果想轉(zhuǎn)換,就要在sum前面套上calculate實現(xiàn)內(nèi)層的轉(zhuǎn)換。

我們現(xiàn)在的案例可以改寫成:
【新建表】表7?=?CALCULATETABLE(ADDColumns('Sheet1',"數(shù)量",calculate(CountRows('Sheet1'))),'Sheet1'[性別]="男")

三、Filter代替Calculatetable
【新建表】表 8 = ADDCOLUMNS(FILTER('Sheet1','Sheet1'[性別]="男"),"數(shù)量",CALCULATE(COUNTROWS('Sheet1')))

運算過程:

四、Calculatetable缺點


當(dāng)初講calculate時,就詳細(xì)說明了一個問題
【度量值】總銷售 = sum('銷售表'[銷售])
【度量值】指定日期1 = Calculate([總銷售],'銷售表'[日期]=date(2021,1,1))
【度量值】指定日期2 = Calculate([總銷售],FILTER(all('銷售表'[日期]),'銷售表'[日期]=date(2021,1,1)))
以上兩個度量值,既然可以用第1個度量值完成,為什么要使用第2個度量值呢?
因為Filter是高級篩選器,《孫興華講PowerBI火力全開》第5課 講到

【新建表】表 9 = CALCULATETABLE('商品表',[總銷售]>6)
// 與calculate一樣,calculatetable不支持 度量值與一個固定值進(jìn)行比較

【新建表】表 10 = FILTER('商品表',[總銷售]>6)

《DAX神功》第1卷第8回 基礎(chǔ)表函數(shù)之ALL與ALLEXCEPT函數(shù) 中,我重點講解了filter第1參數(shù)為何使用一端表的問題。

還是那句話,沒有什么時候就應(yīng)該用什么的說法,一切取決你的業(yè)務(wù),你需求用什么你就用什么。比如很多人問我,他有一個財務(wù)需求或是一個人力需求,自己不會做問我用PowerBI怎么做,甚至還有人這樣問,他說自己的需求保密不能給我看,問我應(yīng)該怎么辦。我想告訴大家,即便你給我看了,我也不一定幫得了你。隔行如隔山,我都不懂你的業(yè)務(wù),又何談分析呢?業(yè)務(wù)都是一點點積累起來的,大家應(yīng)該清楚,很多科學(xué)家、科研人員都是有常年實踐經(jīng)驗的,沒有誰能只坐在辦公室里對著屏幕搞分析,醒一醒,想用PowerBI分析一件事,你必需自己先要會做這件事,DAX只是計算。就好比你不會做一道數(shù)學(xué)題,你買什么樣的計算器也幫不了你。

孫興華講PowerBI火力全開》PowerBI必學(xué)課程
https://www.bilibili.com/video/BV1qa4y1H7wp
《DAX神功》文字版合集:
https://www.bilibili.com/read/readlist/rl442274
《DAX神功》視頻版合集:
https://www.bilibili.com/video/BV1YE411E7p3
PowerBI(DAX函數(shù))、PowerQuery(M函數(shù))、Python辦公自動化、Python爬蟲、Python數(shù)據(jù)分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等
https://www.bilibili.com/read/cv10222110