Power BI之DAX神功:第3卷第21回 ALL系列函數(shù)總結(jié)
今天我們對ALL系列函數(shù)做總結(jié),方便大家學習完前面的課程后到這里查詢:
一、ALL函數(shù)
【1】表函數(shù):返回一張表

返回:姓名列不重復值構(gòu)成的表

關于ALL(表),《權威指南》出現(xiàn)勘誤,我看了同事中文版第444頁(還有其它函數(shù)的描述也出現(xiàn)了問題),ALL系列函數(shù)總結(jié)表,它說ALL當做表函數(shù)時,返回列或表的所有不重復值。顯然不是這樣的,證明如下:
返回:原始表,只是進行了排序。ALL(表)是取這張表的所有行

【2】調(diào)節(jié)器:從指定列或擴展表中刪除篩選器

當學生表與成績表,通過學號建立一對多關系時:
Calculate(Sum('成績表'[分數(shù)]),ALL('學生表'[姓名])) // 刪除學生表姓名列篩選
Calculate(Sum('成績表'[分數(shù)]),ALL('學生表')) // 刪除學生表所有列篩選,因為學生表是1端,擴展列是它本身
Calculate(Sum('成績表'[分數(shù)]),ALL('成績表')) // 刪除學生表和成績表所有列篩選,因為擴展表原理,成績表的擴展表包含學生表所有列?
Calculate(Sum('成績表'[分數(shù)]),ALL())? // 刪除整個模型所有列的篩選
以上證明詳見《DAX神功》第3卷第20回
Ps:《火力全開》筆記28.01 還介紹了REMOVEFILTERS函數(shù),它只能做引擎的調(diào)節(jié)器,功能是ALL函數(shù)的縮水版。(了解一下能看懂別人的代碼即可)
二、ALLEXCEPT函數(shù)
【1】表函數(shù):返回一張表

返回:除了指定列以外,由其它列不重復值構(gòu)成的表

新建表3的等價公式:如果有多個列,使用ALLEXCEPT會精簡代碼量
【2】調(diào)節(jié)器:除指定列以外,刪除其它列篩選,包含擴展表。

當學生表與成績表,通過學號建立一對多關系時:
總分 = Sum('成績表'[分數(shù)])
Calculate([總分],ALLEXCEPT('學生表','學生表'[姓名]))?// 只有學生表姓名列保留篩選
Calculate([總分],ALLEXCEPT('成績表','成績表'[學號]))?// 只有成績表學號列保留篩選,當ALLEXCEPT第1參數(shù)為多端表時,就要考慮擴展表上面的列,本例也同時會刪除學生表所有列的篩選。
【3】調(diào)節(jié)器的特殊用法
詳見《DAX神功》第3卷第14回 提到可以使用ALLEXCEPT函數(shù)恢復指定表篩選

ALLEXCEPT(表2,表1,表3,表4)? // 刪除表2所有列篩選,保留其它表所有列篩選
ALLEXCEPT 第1參數(shù)是可以擴展的那個表,后面的參數(shù)都是關聯(lián)表
【4】注意保留篩選與刪除后添加篩選的區(qū)別
《DAX神功》答網(wǎng)友問15 Allexcept和ALL/VALUES的區(qū)別 刪除與添加篩選器
三、ALLNOBLANKROW函數(shù)
【1】表函數(shù):不考慮無效關系造成的空行

學生表與成績表通過學號連線,由于一端表主鍵元素少于多端表外鍵元素,這是明顯不符合實時參照完整性行為,孫興華講Access基礎篇應該是所有數(shù)據(jù)分析初學者必修課。
詳見《DAX神功》第1卷第9回
【度量值】ALL行數(shù) = COUNTROWS(ALL('學生表'[姓名]))?
【度量值】ALL行數(shù) =?COUNTROWS(ALL('學生表'))
// 返回:3 因為ALL函數(shù)檢查無效關系添加的空行。
【度量值】ALLNOBLANKROW行數(shù) = countrows(ALLNOBLANKROW('學生表'[姓名]))?
【度量值】ALLNOBLANKROW行數(shù) = countrows(ALLNOBLANKROW('學生表'))?
// 返回:2 因為ALLNOBLANKROW函數(shù)不檢查無效關系添加的空行。
總結(jié):做表函數(shù)時ALLNOBLANKROW與ALL就這樣一個區(qū)別。這里指的是因違反實時參照完整性造成無效關系添加的空行,并不是表本身存在的空行。
【2】調(diào)節(jié)器:會添加一個只刪除無效關系產(chǎn)生空白行的篩選器替換原篩選器
詳見《火力全開》筆記08?
實際使用意義不大,學生表中沒有的人,是不會有考試成績的。商品表里沒有的商品是不會產(chǎn)生銷售的。除非...你在講特例。
返回結(jié)果:

但是,當我們使用一端表字段篩選時會顯示下面的情況:因為篩選器被替換所致

處理方法:
返回結(jié)果:問題解決了!

當然這樣的問題,在實際分析中是遇不到的,遇到了就不是你的數(shù)據(jù)問題,而是你所在的單位出問題了!你想想:一個不是你們學校的學生,在你們學校參加考試拿到了畢業(yè)證,這件事能上熱搜。
四、ALLSELECTED函數(shù)
【1】表函數(shù):返回表或列上面最后一個影子上下文中的表或列的不重復值。
原理詳見《DAX神功》第3卷第18回? ?復雜公式強烈建議避開
【2】調(diào)節(jié)器:刪除其它篩選器,激活影子篩選器。
原理詳見《DAX神功》第3卷第18回? ?復雜公式強烈建議避開
【3】調(diào)節(jié)器最基礎的功能(廣泛應用):計算視覺
友情提示:ALLSELECTED函數(shù)有太多坑,建議只應用最基礎的功能。

以上兩張表,通過學號字段建立一對多關系。度量值如下:
返回結(jié)果如下:

【4】無參數(shù)的ALLSELECTED函數(shù)
詳見《DAX神功》第3卷第20回??在這一集中我寫了替代方案,在實際應用中,我基本用不到它。
五、ALLCROSSFILTERED函數(shù)
這個函數(shù)的官方解釋,權威指南上說的很好,微軟幫助文檔太過簡單。但是這個函數(shù)可以被ALL函數(shù)代替,迄今為止我還沒有想出特例中的案例,也有人講過這個函數(shù),最終結(jié)果是ALL函數(shù)可以代替,并且留下一句話:最好把ALLCROSSFILTERED函數(shù)也掌握了,萬一用上了呢。其實,可能會有另一個版本,也可能哪一天,萬一就取消了這個函數(shù),也說不定哦:)

《孫興華講PowerBI火力全開》PowerBI必學課程
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