Power BI之DAX神功:第3卷第18回 影子篩選上下文ALLSELECTED函數(shù)
《DAX神功》第1卷第11回?我只講了ALLSELECTED函數(shù)最基礎(chǔ)的功能:計(jì)算視覺總計(jì)
換成一句話說:無論切片器如何篩選,總計(jì)總是顯示100%。
但是ALLSELECTED函數(shù)太復(fù)雜了,它的坑太多了!特別是嵌套問題,還是建議大家去看權(quán)威指南和高飛老師的解釋。
不同事物針對(duì)群體不同,社會(huì)上需要讓窮人富起來的教程,自然也會(huì)有讓富人更富有的教程?!毒抨柹窆Α泛汀毒抨幷娼?jīng)》最大的區(qū)別,前者讓一個(gè)不會(huì)武功滿身是病的人成為了高手,后者其實(shí)創(chuàng)造了更多高手,但是代價(jià)也很高。
我個(gè)人建議初學(xué)者,明智的做法是避開坑,而不是跳到每一個(gè)坑里看看有多深!大多情況下建議避開ALLSELECTED函數(shù),除非是最基礎(chǔ)的使用。
一、你看不到影子篩選器
影子篩選上下文(影子篩選器),就是篩選上下文,就是一個(gè)還沒有被激活的篩選上下文。


以下兩個(gè)度量值,結(jié)果一樣,但是計(jì)算過程可不同
總分1是篩選上下文,總分2的sumx創(chuàng)建行上下文被度量值轉(zhuǎn)換成了篩選上下文
《DAX神功》第3卷第17回 我們了解了,將行上下文轉(zhuǎn)換成篩選上下文對(duì)內(nèi)存消耗大,占用時(shí)間長(zhǎng)。建議大家,要么使用篩選上下文,要么使用行上下文,盡量避開轉(zhuǎn)換上下文。
【度量值】總分2= sumx('成績(jī)表','成績(jī)表'[分?jǐn)?shù)])
因sumx是迭代函數(shù),生成一個(gè)包含成績(jī)表在當(dāng)前篩選上下文中可見行的影子篩選上下文。
很多書說都是這樣介紹的,請(qǐng)問什么是當(dāng)前篩選上下文中可見行?
答:例如你外部有一個(gè)切片器,當(dāng)你篩選姓名:孫興華,當(dāng)前篩選上下文中可見行就是所有包含孫興華的行。
最重要的一點(diǎn):如果不使用ALLSELECTED激活影子篩選器時(shí),你看不到它的存在。

你要清楚,迭代函數(shù)創(chuàng)建行上下文,行上下文篩選是逐行迭代,他會(huì)生成一個(gè)行篩選器。
影子篩選器就是復(fù)制你的當(dāng)前篩選上下文的篩選器,生成影子篩選器,等ALLSELECTED函數(shù)激活。下面我們通過實(shí)例來講解:
二、當(dāng)ALLSELECTED函數(shù)做篩選調(diào)節(jié)器
以下兩個(gè)度量值我們?cè)?strong>《DAX神功》第1卷第11回詳細(xì)講解過
在沒有篩選的情況下:

我篩選張三和李四時(shí):

矩陣就相當(dāng)于SQL中的一個(gè)查詢,我們的查詢可以生成一張表,因?yàn)槲覀儸F(xiàn)在還沒有講DAX Studio,但是Access基礎(chǔ)篇講過生成表查詢,矩陣是查詢它肯定也可以生成一張表,所以我們可以使用新建表來演示:
接下來我們回憶幾個(gè)知識(shí):
<1> 數(shù)據(jù)沿襲:詳見《DAX神功》第2卷第21回

<2> SUMMARIZECOLUMNS函數(shù) 詳見《火力全開》筆記23.01

利用我們使用之前學(xué)過的知識(shí),將矩陣變成一張表:
我問你第一個(gè)問題,切片器來自哪里?是不是來自學(xué)生表的姓名列?假設(shè)我們選了張三和李四
可以使用表構(gòu)造函數(shù)來表示:{"張三","李四"}
可是你的表構(gòu)造函數(shù)生成的這張表,和我的學(xué)生表姓名列有什么關(guān)系呢?所以這時(shí)我們要應(yīng)用數(shù)據(jù)沿襲原理。
TREATAS({"張三","李四"},'學(xué)生表'[姓名])? // 將第1參做第2參的篩選器,在學(xué)生表姓名列上做標(biāo)記。

SUMMARIZECOLUMNS第1參數(shù)是對(duì)哪個(gè)列分組:我們需要對(duì)'學(xué)生表'[姓名]分組
但是,'學(xué)生表'[姓名]有3個(gè)人,我們外部切片器是不是只選了張三和李四?
現(xiàn)在可以使用SUMMARIZECOLUMNS第2參數(shù)去篩選第1參數(shù),我們篩選張三和李四:TREATAS({"張三","李四"},'學(xué)生表'[姓名])
最后,配上那3個(gè)度量值增加3個(gè)列就OK了!
現(xiàn)在看結(jié)果和矩陣是一樣的:

<3> 我們進(jìn)入分析狀態(tài)
無論外部的切片器和被我們轉(zhuǎn)換成TREATAS({"張三","李四"},'學(xué)生表'[姓名])都是一個(gè)意思,它們都是普通篩選器,有人叫他顯式篩選上下文(顯式篩選器)。
SUMMARIZECOLUMNS是迭代函數(shù),他是行上下文,逐行迭代。
度量值[總分1]:篩選器怎么篩選,我就怎么變!原理如下:

度量值[all總分]:刪除所有篩選器,返回所有人分?jǐn)?shù)總和。
Ps:這里的刪除所有篩選器,指的是刪除所有篩選器進(jìn)行計(jì)算,得到結(jié)果。并不是說不篩選張三和王五!

姓名列的張三和王五,是顯式篩選器進(jìn)行的篩選,但是他們返回的結(jié)果,是在同時(shí)刪除了行上下文篩選器和顯式篩選器的情況下進(jìn)行的計(jì)算,也就是所有人的成績(jī)總和。
度量值[allselected總分]:
迭代函數(shù)生成一個(gè)包含學(xué)生表[姓名]的影子篩選器。它不包含整個(gè)學(xué)生表[姓名]組成的表。只包含其在當(dāng)前篩選上下文中可見的行??梢娦校簭埲⒗钏?。實(shí)際上,影子篩選器在迭代過程中是不活動(dòng)的,除非它被一個(gè)叫做 ALLSELECTED 的函數(shù)激活。
?ALLSELECTED會(huì)在刪除行上下文篩選器和顯式篩選器的情況下,激活影子篩選器,最終計(jì)算張三和李四的總和值。
Ps: ALL函數(shù)是刪除所有篩選器后進(jìn)行計(jì)算。?ALLSELECTED是刪除所有篩選器后激活影子篩選器進(jìn)行計(jì)算。影子篩選器是張三和王五,結(jié)果就是:張三+王五

官方解釋:ALLSELECTED作為篩選調(diào)節(jié)器時(shí),將恢復(fù)參數(shù)所指定列或表的最后一個(gè)影子篩選上下文,如果不存在影子篩選上下文則不執(zhí)行任何操作。
三、當(dāng)ALLSELECTED函數(shù)做表函數(shù)
友情提示:正常情況下我們是不會(huì)這樣做的,強(qiáng)烈建議避開ALLSELECTED函數(shù)
【1】參數(shù)為列

返回結(jié)果:

Calculatetable第1參數(shù)是表,這張表由filter生成,篩選出所有人的名字,再通過Calculatetable篩選一班和二班的學(xué)生姓名。filter確實(shí)創(chuàng)建了影子篩選器:姓名列的張三、李四、王五、小張、小王、小李。但是影子篩選器沒有被激活。因?yàn)闆]有使用ALLSELECTED函數(shù)
當(dāng)我們將Values替換成Allselected時(shí):
返回結(jié)果:

filter生成的影子篩選器是'Sheet1'[姓名],但ALLSELECTED不可能將篩選器應(yīng)用到班級(jí)列。ALLSELECTED刪除了所有篩選器,激活了影子篩選器,但是影子篩選器是姓名列,Calculatetable的篩選器并沒有對(duì)姓名列進(jìn)行篩選,所以結(jié)果是返回所有人姓名。
注意:VALUES 和 DISTINCT 考慮篩選上下文,而 ALLSELECTED 不考慮。它在單個(gè)列上工作,并檢查該列是否被影子篩選上下文過濾,忽略任何交叉篩選。
因?yàn)槲覀兊陌咐挥幸粡埍?,但是你要記住ALLSELECTED忽略任何交叉篩選,VALUES 和 DISTINCT不忽略交叉篩選。
上面這個(gè)案例,ALLSELECTED函數(shù)沒有找到自己能激活的影子篩選器,所以它在本案例中的作用等于同ALL函數(shù)。ALL是刪除其它篩選器,ALLSELECTED刪除其它篩選器激活影子篩選器。
如果想激活影子篩選器,怎么辦?既然知道影子篩選器是'Sheet1'[姓名],你只能去篩選姓名
返回結(jié)果:

如果你將ALLSELECTED函數(shù)改成ALL函數(shù),ALL刪除篩選器,但是不會(huì)激活影子篩選器
返回結(jié)果:

【2】當(dāng)參數(shù)為表的時(shí)候
ALLSELECTED(表):大家都知道一張表由多個(gè)列組成,任何一個(gè)列都可能通過篩選器篩選,也可以被定義為影子篩選器。不嵌套是真香,一嵌套是真坑!(我不給你們講嵌套,因?yàn)槟切┒伎梢员苊猓也幌肟幽銈儯?/p>
返回結(jié)果:

filter生成了Sheet1所有列的影子篩選器,ALLSELECTED激活了所有影子篩選器,所以隨意篩選了。恰恰因?yàn)檫@樣,一張表中可能有10多個(gè)列,有顯式篩選器,有影子篩選器,東西一多你就亂了。所以事情沒有這么簡(jiǎn)單!切記要小心!盡量避開ALLSELECTED函數(shù)。

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