Power BI之DAX神功番外篇:第1回 Calculate+ALL表 與 Filter+ALL表 是兩個概念
各位網(wǎng)友大家好!PowerBI之DAX神功番外篇專門處理《DAX神功》中講過的,但是仍有網(wǎng)友提問的問題!為了不干擾《DAX神功》正常流程,特開此系列
一、網(wǎng)友需求
友情提示:截圖你看不清楚沒關(guān)系,我會復(fù)述網(wǎng)友的提問

我來復(fù)述一下網(wǎng)友提問,有如下一張表:

寫了兩個度量值:
A1 = CALCULATE(sum('表'[數(shù)量]),FILTER(ALL('表'),SUM('表'[數(shù)量])>2))
A2 = CALCULATE(SUM('表'[數(shù)量]),FILTER(all('表'),CALCULATE(sum('表'[數(shù)量]))>2 ))
Ps: A2的等價度量值
總數(shù)量=SUM('表'[數(shù)量])
A2等價=?CALCULATE([總數(shù)量],FILTER(all('表'),[總數(shù)量]>2 ))
在矩陣上的顯示結(jié)果:

二、聲明:這個案例有誤區(qū)
這個案例網(wǎng)友一定是從一些網(wǎng)站或群里獲取到的,案例本身是國外某文章上的原例,是為了給你講內(nèi)層、外層、隱形、顯形而專門設(shè)計的特殊案例,但是這樣也必然會給人們帶來疑惑!它會給你一個誤區(qū),讓你覺得A1可以過濾掉A和B,其實這里面的水很深。千萬不要死記硬背,要動腦子!避開誤區(qū)更易理解。
三、用新的表格查看A1和A2的結(jié)果
Ps:我增加一行種類為A的數(shù)據(jù),讓這張表不在是一端表,這樣更易理解

還是這兩個度量值:
A1 = CALCULATE(sum('表'[數(shù)量]),FILTER(ALL('表'),SUM('表'[數(shù)量])>2))
A2 = CALCULATE(SUM('表'[數(shù)量]),FILTER(all('表'),CALCULATE(sum('表'[數(shù)量]))>2 ))

四、注意:all表在filter和calculate中是兩個意思
網(wǎng)友們最大的誤區(qū)就是將Calculate+all(表) 與 filter+all(表) 搞混淆
《DAX神功》第1卷第21回? ?我們講到 all有多個功能,其中它可以是calculate的調(diào)節(jié)器,也可以是表。在calculate中做參數(shù)時它是調(diào)節(jié)器(取消篩選功能),但是在filter中它只是表而已!
證明如下:是否使用all(表) 與?在Filter中篩選這張表無關(guān),因為all(表)還是返回這張表,不影響filter的篩選,他在filter中不是取消篩選的功能,他只是一張表。
證明1:在新建表中? ?表1=all('表')? ?//返回的還是原表??

證明2:是否使用all(表) 篩選的結(jié)果是一樣的
表 2 = FILTER('表',sum('表'[數(shù)量])>2)

表 3 = FILTER(all('表'),sum('表'[數(shù)量])>2)

表 4 = FILTER('表',CALCULATE(sum('表'[數(shù)量]))>2)

表 5 = FILTER(all('表'),CALCULATE(sum('表'[數(shù)量]))>2)

五、如果我們用的是 filter+表 是什么樣子?
接下來我們做如下測試:
A1改 = CALCULATE(sum('表'[數(shù)量]),FILTER('表',SUM('表'[數(shù)量])>2))
A2改 = CALCULATE(SUM('表'[數(shù)量]),FILTER('表',CALCULATE(sum('表'[數(shù)量]))>2 ))

電視劇《大宅門》白景琦說過:中醫(yī)治病不是哪疼治哪,有時腦袋疼就要治腳!
要理解 calculate+filter(all表) 必先理解 calculate+filter(表)
六、度量值【A1改】的原理是什么
A1改 = CALCULATE(sum('表'[數(shù)量]),FILTER('表',SUM('表'[數(shù)量])>2))
迷惑人的地方:新建表中返回了原表,因為filter是行上下文,當(dāng)你沒有聚合條件時,它肯定返回原表。

A1改的工作流程:前提是你用種類做行標(biāo)題

當(dāng)我們得到ACDE這張表以后,放到calculate中做篩選條件:
A1改= calculate(計算器, ACDE這張表)
篩選每個種類的數(shù)量和大于2的,得到的表是ACDE種類的表。將其放到calculate的篩選器中得到的就是ACDE商品的數(shù)量
注意:他并不是將每一行賦值之后再計算ABCDE聚合后的結(jié)果,而是直接篩選ABCDE聚合后大于2的結(jié)果。
七、“母子關(guān)系”:為什么度量值【A1改】的總計是18,而不是16?
“母子關(guān)系”是《DAX神功》獨創(chuàng)的。

李四(女)懷孕了,但是她的丈夫張三突發(fā)意外身亡。王五(男)娶了李四,李四成了王五的合法妻子,但是李四的孩子并不是王五的。所以A1改的總計仍然顯示是18,因為filter里面的SUM('表'[數(shù)量])=18,最外層的calculate只負責(zé)讓母親改嫁,它無法讓filter內(nèi)層的SUM('表'[數(shù)量])實現(xiàn)篩選功能。
想讓孩子有一個快樂的童年,一家三口幸福的過日子,將這個消息深深的掩埋是一個善意的謊言。所以度量值A(chǔ)2改的filter內(nèi)的calculate負責(zé)將孩子轉(zhuǎn)化成王五的兒子,就好比隨了王五的姓。所以A2改的總計是15。
A1改 = CALCULATE(sum('表'[數(shù)量]),FILTER('表',SUM('表'[數(shù)量])>2))
A2改 = CALCULATE(SUM('表'[數(shù)量]),FILTER('表',CALCULATE(sum('表'[數(shù)量]))>2 ))
八、度量值【A1】的原理是什么?
A1 = CALCULATE(sum('表'[數(shù)量]),FILTER(ALL('表'),SUM('表'[數(shù)量])>2))
大家注意下面這段話:
FILTER(ALL('表'),SUM('表'[數(shù)量])>2) 與 FILTER('表',SUM('表'[數(shù)量])>2)? 單純來看并無區(qū)別
但是當(dāng)你將FILTER(ALL('表'),SUM('表'[數(shù)量])>2) 放到Calculate中,all(表)的調(diào)節(jié)器功能就展現(xiàn)出來了。他變成了 calculate+all(表)的形式
FILTER(ALL('表'),SUM('表'[數(shù)量])>2) 得到ACDE商品的表,根據(jù)“母子關(guān)系”,A1改的總計是18,所以A1每一項都是18,因為all(表)。


九、度量值【A2改】的原理是什么?
A2改 = CALCULATE(SUM('表'[數(shù)量]),FILTER('表',CALCULATE(sum('表'[數(shù)量]))>2 ))
因為:FILTER('表',CALCULATE(sum('表'[數(shù)量]))>2 ) 內(nèi)部使用了Calculate,他將值賦值到每一行,再篩選出大于2的

所以,現(xiàn)在得到了ACDE這張表,放到Calculate中也會得到ACDE的值,不過它與A1改是有區(qū)別的,A1改直接篩選每個種類聚合后大于2的,而A2改分配給每一行后篩選大于2的。
十、度量值【A2】的原理是什么
A2 = CALCULATE(SUM('表'[數(shù)量]),FILTER(all('表'),CALCULATE(sum('表'[數(shù)量]))>2 ))
FILTER(all('表'),CALCULATE(sum('表'[數(shù)量]))>2 ) 與 FILTER('表',CALCULATE(sum('表'[數(shù)量]))>2 ) 在單獨使用時沒有區(qū)別,都顯示ACDE商品的表
但是放到Calculate中 all(表)的調(diào)節(jié)器作用生效,由于你在filter中使用了calculate實現(xiàn)了對sum('表'[數(shù)量])的篩選功能,根據(jù)“母子關(guān)系”,A2改的 總計是15,所以每一行顯示者是15
且:A2改和A1改的重要區(qū)別,A2改是將值分配給每一行(就是整個表)再篩選,A1改直接篩選符合條件的。所以A2就是所有的種類都是15。

《孫興華講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