Power BI之DAX神功:答網(wǎng)友問(wèn)16 使用ALL函數(shù)避免上下文轉(zhuǎn)換與ISEMPTY函數(shù)
一、第1位網(wǎng)友提問(wèn)
你在《DAX神功》第1卷第21回講的Calculate計(jì)值順序,與權(quán)威指南本節(jié)背道而馳
權(quán)威指南第二版(國(guó)譯)P312? 寫著Calculate執(zhí)行步驟:首先計(jì)算篩選器參數(shù),然后如果有行上下文,則執(zhí)行上下文轉(zhuǎn)換,接下來(lái)應(yīng)用調(diào)節(jié)器。
還有這節(jié)課書中提供的兩個(gè)度量值都是錯(cuò)的!(友情提示:不要輕易說(shuō)別人是錯(cuò)的)
二、回答第1位網(wǎng)友問(wèn)題
我向同事借了中文版第二版,已經(jīng)確認(rèn),拜托你看一下P313頁(yè)第2段
今天這個(gè)問(wèn)題是豪無(wú)意義的討論,事情非常簡(jiǎn)單,不建議陷入死循環(huán)研究原理。有些事情是具有特殊性的,需要具體問(wèn)題具體分析的:
羅老師曾經(jīng)提到過(guò)這樣的案例:張三持武器打李四,李四無(wú)處可逃并且已經(jīng)受傷了,他能否在保護(hù)自己生命安全的情況下還手呢?
負(fù)責(zé)任的告訴大家:回答還手和不還手都是害李四。你要李四還手李四輕則拘留重則判刑。你不讓李四還手,輕則受傷,重則殘疾,甚至永遠(yuǎn)的離開我們。
羅老師也是把事情的嚴(yán)重性和后果都講清楚,讓李四自己決定。
今天你問(wèn)的ALL函數(shù)避免上下文轉(zhuǎn)換這件事,你整了一堆官方語(yǔ)言,只能讓你懷疑人生。
《DAX神功》第1卷第8回 我已經(jīng)講清楚了書中這節(jié)課要表達(dá)的意思
你第二個(gè)問(wèn)題,我聲明:人家書沒錯(cuò),是你將新建列寫成度量值,所以結(jié)果錯(cuò)了
三、意思很簡(jiǎn)單,書上講的太官方
有如下兩張表,一端表連接多端表:


【度量值】總分 = SUMX('成績(jī)表','成績(jī)表'[平時(shí)成績(jī)]+'成績(jī)表'[考試成績(jī)])
【新建列】分=[總分]
// 如果在新建列時(shí)使用?? 分=SUMX('成績(jī)表','成績(jī)表'[平時(shí)成績(jī)]+'成績(jī)表'[考試成績(jī)]) 那么sumx要套上Calculate將迭代函數(shù)行上下文轉(zhuǎn)換成篩選上下文才能實(shí)現(xiàn)下圖的結(jié)果,但是使用度量值時(shí),它相當(dāng)于天生就套上了Calculate。

【新建列】all列 = CALCULATE([總分],ALL('學(xué)生表'))
// 當(dāng)我們使用all(學(xué)生表)時(shí),學(xué)生表所有字段都刪除篩選(不能篩選),我們是在學(xué)生表中新建列,所以每一行顯示的都是所有學(xué)生的總成績(jī)90

【新建列】allexcept列 = CALCULATE([總分],ALLEXCEPT('學(xué)生表','學(xué)生表'[班級(jí)]))
//?ALLEXCEPT('學(xué)生表','學(xué)生表'[班級(jí)]) 除了學(xué)生表中的班級(jí)列以外刪除其它所有表字段的篩選(包含關(guān)聯(lián)表【就是有連線關(guān)系的表】),所以一班對(duì)應(yīng)60,二班對(duì)應(yīng)30

這樣就可以方便的算出:每人占全??偡值陌俜直龋驼及嗉?jí)總分的百分比。
以上,《DAX神功》第1卷第8回,我們都講過(guò)!這樣記,我覺得比官方語(yǔ)言好多了。
四、第2位網(wǎng)友問(wèn)題
《PowerBI火力全開》第22課信息函數(shù)ISEMPTY很雞肋呀,有什么實(shí)際用途嗎?
還有權(quán)威指南上關(guān)于這節(jié)課公式中使用了ALLSELECTED()沒有寫參數(shù),是什么意思
PS:關(guān)于ALLSELECTED()沒有寫參數(shù)這個(gè)問(wèn)題我會(huì)在《DAX神功》第3卷中做詳細(xì)講解,案例你可以先跳過(guò),我會(huì)在精講ALLSELECTED函數(shù)時(shí),解讀這個(gè)案例,ALLSELECTED是最復(fù)雜的DAX函數(shù)。
五、回答第2位網(wǎng)友問(wèn)題
這個(gè)函數(shù)可以代替的方法很多,使用它也只是性能(速度)提升
ISEMPTY(表或表達(dá)式生成的表)
作用:檢查表或表表達(dá)式是否為空
使用 COUNTROWS 統(tǒng)計(jì)表的行數(shù)也可以檢查表是否為空,但這種做法的弊端在于當(dāng)表不為空時(shí),公式還計(jì)算出了它的行數(shù),增加計(jì)算時(shí)間
以上來(lái)自《火力全開》筆記

【度量值】慢 = COUNTROWS ('Sheet1') = 0
// 計(jì)算Sheet1這張表有多少行,再判斷是不是等于0行,這樣效率是最低的
【度量值】中 = ISBLANK ( COUNTROWS ('Sheet1') )
// 計(jì)算Sheet1這張表有多少行,再判斷是不是為空,效率會(huì)比上一個(gè)好一點(diǎn)
【度量值】快 = ISEMPTY ( 'Sheet1' )?
// 判斷Sheet1這張表是否為空,效率最快

上面三個(gè)度量值都是真實(shí)的表格,表達(dá)式如何表示呢?所有的表函數(shù),大部分時(shí)間智能日期函數(shù)都可以。
【度量值】判斷 = ISEMPTY(CALCULATETABLE('Sheet1','Sheet1'[性別]=BLANK()))
// 因?yàn)镾heet1表中三個(gè)人我都填寫了性別,篩選性別空的表就是一張空表,所以ISEMPTY結(jié)果返回True

關(guān)于權(quán)威指南上的本課案例建議你先跳過(guò),權(quán)威指南在第14章講的ALLSELECTED(),可是在第10章就開始超前使用,我的建議是一步一個(gè)腳印,等我講完ALLSELECTED(),會(huì)解讀這個(gè)案例的原理。
《孫興華講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辦公自動(dòng)化、Python爬蟲、Python數(shù)據(jù)分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等
https://www.bilibili.com/read/cv10222110