PowerBI之DAX神功:第1卷第12回 理解上下文
《孫興華講PowerBI火力全開》筆記06.被翻譯耽誤的上下文
我使用最精簡的語言闡述了上下文:
1.新建列是行上下文,行上下文沒有篩選功能
2.想讓行上下文實現(xiàn)篩選功能就要在外面套一個Calculate
3.度量值是篩選上下文,度量值天生具有篩選功能
記住這3句話,你就知道什么是上下文了。
公式:平時總分=Sum('Sheet1'[平時成績])? 我們分別放在新建列和度量值中
【1】將公式用在新建列上時,因為新建列是行上下文,沒有篩選功能,返回的結(jié)果就是平時成績那一列的總和值60

【2】給新建列套上一個Calculate就實現(xiàn)了行上下文轉(zhuǎn)篩選上下文
【新建列】平時總分=Calculate(sum('Sheet1'[平時成績]))

很多人在這個時候,「走火入魔」,他們認為Calculate有兩個參數(shù),第1參數(shù)是計算器,第2參數(shù)是篩選器,怎么不寫第2參數(shù)也可以呢?
答:一定要養(yǎng)成自學的能力,以前你上學時,學的知識是如何將那張考卷考出圓滿的成績,等你工作以后,紙上談兵的事情會越來越少。遇到這樣的問題,直接看幫助文檔就解決了。

Calculate第二參數(shù)是可選參數(shù),Calculate(sum('Sheet1'[平時成績])) 我們只是讓sum('Sheet1'[平時成績])具備篩選功能,沒有必要去設(shè)置篩選條件
這時Calculate的作用就是將行上下文件轉(zhuǎn)換成篩選上下文件
【3】用在度量值上,度量值天生具有篩選功能
【度量值】平時總分=Sum('Sheet1'[平時成績])?
如果將度量值放到矩陣里,那肯定有篩選功能:

將度量值放到新建列中,同樣可以實現(xiàn)篩選,因為度量值天生具有篩選功能
【新建列】新建列 = [平時總分]??

【4】解決問題,有網(wǎng)友問過我,為什么?
【新建列】總分 = 'Sheet1'[平時成績] + 'Sheet1'[考試成績]? ?// 正確
【度量值】總分 = 'Sheet1'[平時成績] + 'Sheet1'[考試成績]? ?// 錯誤
電視劇《鐵齒銅牙紀曉嵐》中有一集,那時候紀曉嵐是侍郎(官職) 和珅是尚書(官職)和珅就看到一只狗問紀曉嵐 :是狼(侍郎)是狗? 紀曉嵐回答:看尾巴,尾巴下垂的是狼,尾巴上豎(尚書)是狗。

【新建列】總分 = 'Sheet1'[平時成績] + 'Sheet1'[考試成績]
新建列是行上下文,逐行掃描,例如:
10+1=11
20+2=22
30+3=33
都是逐行計算, 新建列自動創(chuàng)建行上下文

而度量值是一個篩選上下文:

所以我們的公式應(yīng)該這樣寫
[度量值] 總分 = sum(Sheet1[平時成績])+sum(Sheet1[考試成績])
解讀:就是兩個具有篩選功能的度量值相加;兩杯自來水倒在一個杯子里還是自來水。
將度量值放到矩陣中:

將度量值放到新建列上:
【新建列】 新建列 = [總分]

現(xiàn)在我們觀察一下剛才寫的度量值
[度量值] 總分 = sum(Sheet1[平時成績])+sum(Sheet1[考試成績])
還有另外一種方法可以寫:這是《The Definitive Guide to DAX》上介紹的方法
[度量值] 總分 = sumx('Sheet1','Sheet1'[平時成績]+'Sheet1'[考試成績])
sumx是迭代函數(shù),它是在創(chuàng)建行上下文(讓兩個列的每一行相加),如果將它放到了度量值中,就被轉(zhuǎn)換成篩選上下文了
為什么不能寫成
【度量值】總分 = 'Sheet1'[平時成績] + 'Sheet1'[考試成績]
因為度量值是篩選上下文,它可以將行上下文轉(zhuǎn)化為篩選上下文,但是它不能創(chuàng)建行上下文
'Sheet1'[平時成績] + 'Sheet1'[考試成績]
兩個列相加這是在創(chuàng)建行上下文的過程
sumx是迭代函數(shù),我們需要先用迭代函數(shù)創(chuàng)建行上下文之后,放到度量值中做轉(zhuǎn)換
《The Definitive Guide to DAX》指出:如果需要在度量值中使用行上下文,則請使用迭代函數(shù)。
實際上,方法并不唯一,今天我就給你們展示了另外一種方法。
我最不喜歡聽到的一句話:“學英語的重要性,是我們可以看國外的更多文獻和書籍”,就算你看外國人寫的地理和歷史書籍,都需要用腦子,書和文字是固定的,腦子是活的。

《PowerBI之DAX神功》視頻版,同步更新中。。。。
https://www.bilibili.com/video/BV1YE411E7p3