Power BI之DAX神功:第3卷第20回 無(wú)參數(shù)的ALLSELECTED函數(shù),用1+1等于2的方法避坑
ALLSELECTED 函數(shù)支持三種類型的參數(shù):
單列或多列:ALLSELECTED (表名[列名])
整張表:ALLSELECTED (表名)
關(guān)于以上兩種參數(shù),我們分別在《DAX神功》第1卷第11回、第3卷第18回、第19回做了詳解
當(dāng)然,我講的并不深入,因?yàn)槁凡恢灰粭l,有些困難是要迎面而上,但是有一些是可以避開(kāi)的。我自己也選擇避開(kāi)!當(dāng)然我并不反對(duì)你深入研究,上節(jié)課我也告知你深入研究的地方。
你還可以使用不帶參數(shù)的 ALLSELECTED(),今天我們重點(diǎn)講講不帶參數(shù)的情況
注意:在不使用任何參數(shù)的情況下ALLSELECTED函數(shù)只能作為 CALCULATE或CALCULATETABLE 調(diào)節(jié)器。因?yàn)?strong>它沒(méi)參數(shù),它肯定無(wú)法返回成一張表,自然也就做不成表函數(shù)。
有了上面這句話,問(wèn)題就簡(jiǎn)單多了,之所以單拿出來(lái)講,是因?yàn)镈AX專家很多代碼沒(méi)有必要寫成那樣,在學(xué)習(xí)ALLSELECTED()無(wú)參數(shù)之前,我們需要先理解ALL()無(wú)參數(shù)。


一、ALL()無(wú)參數(shù)
【度量值】總分 = SUM('成績(jī)表'[分?jǐn)?shù)])
【度量值】all學(xué)生表 = CALCULATE([總分],ALL('學(xué)生表')) // 刪除學(xué)生表所有列的篩選

【度量值】all學(xué)生表姓名 = CALCULATE([總分],ALL('學(xué)生表'[姓名]))
// 只刪除學(xué)生表姓名列的篩選
【度量值】all學(xué)生表班級(jí) = CALCULATE([總分],ALL('學(xué)生表'[班級(jí)]))
// 只刪除學(xué)生表班級(jí)列的篩選,但是學(xué)生表姓名列可以篩選

【度量值】all成績(jī)表學(xué)號(hào)列 = CALCULATE([總分],ALL('成績(jī)表'[學(xué)號(hào)]))
// 刪除成績(jī)表學(xué)號(hào)列的篩選,不影響其它篩選

【度量值】all成績(jī)表 = CALCULATE([總分],ALL('成績(jī)表'))
// 因?yàn)閷W(xué)生表與成績(jī)表是一對(duì)多關(guān)系,成績(jī)表是多端向一端擴(kuò)展學(xué)生表中的所有列,所以當(dāng)all成績(jī)表時(shí),成績(jī)表的擴(kuò)展表中所有列都刪除篩選。

【度量值】all無(wú)參數(shù) = CALCULATE([總分],ALL())
// 在整個(gè)模型中刪除任何篩選器

因?yàn)槲覀冎挥袃蓮埍?,all()返回的結(jié)果與all(成績(jī)表)是一樣的
為了解釋這個(gè)問(wèn)題,我們?cè)偈仲v一次


《DAX神功》第1卷第2回我們學(xué)習(xí)了,箭頭方向符合條件時(shí),在整條線路中不存在多對(duì)多關(guān)系時(shí),開(kāi)始表可以篩選結(jié)束表。我們制度兩個(gè)度量值:
返回結(jié)果:

原本學(xué)生表中的姓名列是可以篩選日期表,但是當(dāng)使用all()整個(gè)模型中原本能用的篩選器都被刪除了。因?yàn)閷W(xué)生表和日期表都是一端表,你總不能說(shuō)在一對(duì)多關(guān)系中一端表有擴(kuò)展列吧?
二、ALLSELECTED()無(wú)參數(shù)
ALLSELECTED():激活任何列最后一個(gè)影子篩選器,如果沒(méi)有影子篩選器當(dāng)然無(wú)法激活了。
通過(guò)商品編碼,建立一對(duì)多關(guān)系:

我們將上面兩個(gè)度量值放入矩陣:

《DAX神功》第3卷第18回 原例,只是改了個(gè)表。我跟大家說(shuō)矩陣就是查詢,是查詢就能生成表,就可以通過(guò)新建表舉例:過(guò)程就不再重復(fù)了,我們直接新建表
返回結(jié)果:

顯式篩選器:蘋果、土豆、西瓜
影子篩選器:商品表[商品名稱]通過(guò)顯式篩選器后顯示的可見(jiàn)行
allselected刪除所有篩選器,激活影子篩選器后進(jìn)行計(jì)算,所以每一行顯示6+4+null=10
現(xiàn)在我們將其改成allselected()無(wú)參數(shù)
返回結(jié)果:

因?yàn)槲覀儼咐校挥幸粋€(gè)列上有影子篩選器,且只有一個(gè)影子篩選器。我跟大家一直說(shuō),不建議你們嵌套或在復(fù)雜公式中使用allselected函數(shù)。切記!如果我們盡量避開(kāi)allselected函數(shù),換而言之,ALLSELECTED()存在的意義就很小了。
三、計(jì)算從未購(gòu)買過(guò)某些產(chǎn)品的客戶數(shù)量
這是一道由DAX專家舉出的例子,如果是我,我會(huì)用下面的方法做:
返回結(jié)果:

上面的方法,就算是DAX初學(xué)者也會(huì)吧?這不就避開(kāi)了Allselected了嗎?
allselected一旦使用,連專家也會(huì)進(jìn)入走火入魔的狀態(tài),當(dāng)年歐陽(yáng)峰前輩第2次華山論劍,雖然勝出,可是身體狀況...例如這個(gè)案例,DAX專家這樣寫。(如果你覺(jué)得書上不是這樣寫的,麻煩您問(wèn)問(wèn)作者或譯者,看是不是有勘誤)
度量值如下:
返回結(jié)果:

你看上去沒(méi)毛病吧?你篩選一下商品名稱看看

解決方法,將allselected()改成all()
返回結(jié)果:

因?yàn)閒ilter創(chuàng)建了tb1中所有列的影子上下文,如果使用allselected()他會(huì)激活這個(gè)影子篩選器,可是我現(xiàn)在的實(shí)際情況就不能讓它篩選。如果一定要這么寫公式,我也是這樣寫:
返回結(jié)果:

這不也避開(kāi)了allselected嗎?當(dāng)然這樣寫都沒(méi)必要,你就用我第一種方法就好了。
四、將銷售額計(jì)算范圍縮小至首年客戶

意思:B1和B2第1年就買東西了,要計(jì)算首年顧客,在每個(gè)年份的消費(fèi)金額。不需要B3的數(shù)據(jù)。
制作動(dòng)態(tài)日期表:

我們先看看DAX專家是這樣寫的:寫的對(duì)!太對(duì)了!
返回結(jié)果:

你知道困擾你的地方在哪里嗎?因?yàn)樗褂昧薃LLSELECTED(),哪有影子呀?
在這里使用ALLSELECTED()和all()是一樣,沒(méi)影子就跟all()一樣了
而且tb2根本就不用all(),干嘛呀?先刪除篩選再恢復(fù)篩選。你看我下面的寫法:
返回結(jié)果:

公式分析:
(1)FIRSTNONBLANK('日期表'[年],[總銷售])? // 第一個(gè)銷售不為空的年份?,返回2020
// 這個(gè)2020具有'日期表'[年]的數(shù)據(jù)沿襲,詳見(jiàn)《DAX神功》答網(wǎng)友問(wèn)12
(2)這個(gè)2020可是固定的,不能篩選,因?yàn)槲覀兇_定的是首年永遠(yuǎn)都是2020年。
CALCULATETABLE(FIRSTNONBLANK('日期表'[年],[總銷售]),ALL())
(3)CALCULATETABLE(VALUES('銷售表'[會(huì)員卡號(hào)]),tb1) // 篩選2020年的會(huì)員卡號(hào),返回會(huì)員卡號(hào)是B1、B2的這張表
(4)?CALCULATE([總銷售],tb2)? // 篩選會(huì)員卡號(hào)是B1和B2的銷售
我就問(wèn)你,這里面有原理嗎?這不都是語(yǔ)法嗎?
好比,快遞就在樓下快遞柜里,我下去拿回來(lái)就好了!不行,為了研究原理,我一定要去法院起訴,讓法院把這個(gè)快遞判給我,我才能去取。結(jié)果是相同的,最終快遞都回到我手中了,可是后者有什么必要呢?這快遞本來(lái)就是我的。
再次建議大家,allselected我們只用最基本的功能,其它功能我遇到的基本可以被替代,不要給自己增加麻煩。

《孫興華講PowerBI火力全開(kāi)》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