Power BI之DAX神功:第2卷第22回 簡(jiǎn)單篩選器與固化篩選器
一、簡(jiǎn)單篩選器:列篩選器與表篩選器的區(qū)別


【度量值】總數(shù)量 = sum('銷售表'[銷售數(shù)量])
【度量值】李四列篩選?= CALCULATE([總數(shù)量],'商品表'[供商]="李四")?

【度量值】李四表篩選 = CALCULATE([總數(shù)量],FILTER('商品表','商品表'[供商]="李四"))

我們使用日期做行篩選時(shí),發(fā)現(xiàn)結(jié)果是一樣的:

但是大家心里都懂,這不一樣:《DAX神功》第1卷第18回?我們講過(guò)列篩選器的等價(jià)公式:
Ps: 因?yàn)楝F(xiàn)在還沒有講擴(kuò)展表的知識(shí),所以先以等價(jià)公式做解釋
李四列篩選?= CALCULATE([總數(shù)量],'商品表'[供商]="李四")?
李四列等價(jià) = CALCULATE([總數(shù)量],FILTER(all('商品表'[供商]),'商品表'[供商]="李四"))
李四表篩選 =?CALCULATE([總數(shù)量],FILTER('商品表','商品表'[供商]="李四"))
從上面的公式我們可以看出,列篩選與表篩選的區(qū)別,列篩選等同于刪除了指定列的篩選

二、簡(jiǎn)單篩選器:兩種篩選關(guān)系
【1】雙人成行(合作)
雙人成行很多人都玩過(guò),是一款典型的合作游戲,雙人配合游戲,非常好玩!

不一定是兩個(gè)篩選列,可以是多個(gè)。但是大家要協(xié)同工作得到最后的答案:
合作 = CALCULATE([總數(shù)量],'銷售表'[日期]=date(2021,1,1),'商品表'[供商]="李四")
// 在銷售表日期列篩選2021/1/1,在商品表供商列篩選李四

【2】二手游戲(套娃)
我們買完一個(gè)實(shí)體版游戲,通關(guān)了,不想玩了,可以賣掉回血。但是二手游戲大多是個(gè)人交易,你要承擔(dān)如下風(fēng)險(xiǎn):
你買游戲,他寄來(lái)的是不是空盒
你買游戲,二手卡帶和光盤劃傷是否會(huì)影響讀取
你賣游戲,對(duì)方收到會(huì)不會(huì)到手后砍價(jià)
你賣游戲,對(duì)方會(huì)不會(huì)收到后告訴你是空盒
.......風(fēng)險(xiǎn)還有很多不再例舉
二手游戲我覺得當(dāng)面交易,試好付款的方式最靠譜。

所以套娃會(huì)有很大的風(fēng)險(xiǎn),我們盡量避免套娃:
《DAX神功》第1卷第18回:我提到了Calculate嵌套也可以從內(nèi)向外, 以下面為例:
套娃 = calculate(CALCULATE([總數(shù)量],'銷售表'[日期]=date(2021,1,1)) ,'商品表'[供商]="李四")
無(wú)論你說(shuō)是從外向內(nèi):先篩選李四,再篩選2021/1/1,或者說(shuō)從內(nèi)向外:先篩選2021/1/1,再篩選李四,兩種說(shuō)法結(jié)果是一樣的。
現(xiàn)在我們換一個(gè)公式,只篩選同一列:
套娃 = calculate(CALCULATE([總數(shù)量],'銷售表'[日期]=date(2021,1,1))?,'銷售表'[日期]=date(2021,1,2))
哈羅雷球白夕尚*+權(quán)威指南作者認(rèn)為是從外向內(nèi)計(jì)算:理由如下

孫興華同意上面的說(shuō)法,但是孫興華同時(shí)認(rèn)為也可以從內(nèi)向外計(jì)算:(結(jié)論:答案不唯一)
我們觀察下面這個(gè)公式內(nèi)層:
套娃 = calculate(CALCULATE([總數(shù)量],'銷售表'[日期]=date(2021,1,1))?,'銷售表'[日期]=date(2021,1,2))
內(nèi)層=CALCULATE([總數(shù)量],'銷售表'[日期]=date(2021,1,1))?
內(nèi)層等價(jià)=CALCULATE([總數(shù)量],filter(all('銷售表'[日期]),'銷售表'[日期]=date(2021,1,1)))?
再觀察外層公式:
外層=calculate(內(nèi)層?,'銷售表'[日期]=date(2021,1,2))
外層等價(jià)=calculate(內(nèi)層?,filter(all('銷售表'[日期]),'銷售表'[日期]=date(2021,1,2)))
既然內(nèi)層已經(jīng)刪除了'銷售表'[日期]的篩選,內(nèi)部與外部篩選器都失效,你外層還怎么篩選2021/1/2 ,這不是典型的從內(nèi)向外嗎?

三、什么是固化篩選器?
固化篩選器,在PowerBI中可以通過(guò)切片器創(chuàng)建。

如果我們使用簡(jiǎn)單篩選器完成下面的工作:例如我有如下一張表,我想將2021年8月和2022年3月的表篩選出來(lái)

【新建表】篩選表 = FILTER(Sheet1,'Sheet1'[年份]=2021 && 'Sheet1'[月份]=8 || 'Sheet1'[年份]=2022 && 'Sheet1'[月份]=3)

我們也可以配合上節(jié)課的數(shù)據(jù)沿襲將新建表寫成:
【新建表】數(shù)據(jù)沿襲 = TREATAS({(2021,8),(2022,3)},'Sheet1'[年份],'Sheet1'[月份])

//?{(2021,8),(2022,3)} 我們?cè)凇禗AX神功》第1卷第3回表構(gòu)造函數(shù)中講解的
//?TREATAS我們?cè)?strong>《DAX神功》第2卷第21回 講解的,分別將2021年8月和2022年3月在年份和月份列上做記號(hào)
Ps:數(shù)量我們一般都是通過(guò)度量值得到
【度量值】結(jié)果 = CALCULATE(SUM(Sheet1[數(shù)量]),keepfilters(TREATAS({(2021,8),(2022,3)},'Sheet1'[年份],'Sheet1'[月份])))

以上我們演示的都是簡(jiǎn)單篩選器。
固化篩選器:
(1)切片器:放年和月(注意順序)

(2)如下圖

其實(shí)你一直在用固化篩選器,只是不知道它叫什么名字而已。
四、無(wú)論簡(jiǎn)單還是固化篩選器都要注意的問(wèn)題
【1】被刪除篩選的列如何處理(方法不唯一)

// 我故意將2021年和2022年月份錯(cuò)峰展示 ,讓大家看看區(qū)別
【新建表】
日期表 = ADDCOLUMNS(
CALENDAR(FIRSTDATE('Sheet2'[日期]),LASTDATE('Sheet2'[日期])),
"年", YEAR ( [Date] ),
"季度", ROUNDUP(MONTH([Date])/3,0),
"月", MONTH([Date]),
"周", weeknum([Date]),
"年季度", year([date]) & "Q" & ROUNDUP(MONTH([Date])/3,0),
"年月", year([Date]) * 100 + MONTH([Date]),
"年周", year([Date]) * 100 + weeknum([Date]),
"星期幾", WEEKDAY([Date])
)

【度量值】總銷售 = sum('Sheet2'[銷售])
【度量值】2021年銷售 = CALCULATE([總銷售],'日期表'[年]=2021)?
// 取消了對(duì)字段【年】的篩選,但是保留了字段【月】的篩選,2022年1、3、5、6月仍然是2021年的值。所以這是錯(cuò)誤的。
解決方案:
【度量值】2021keep = CALCULATE([總銷售],KEEPFILTERS('日期表'[年]=2021))

【2】覆蓋是可以跳過(guò)的
在講Calculate嵌套運(yùn)算順序時(shí),我當(dāng)然明白覆蓋是什么意思,但是我想能不能跳過(guò)這個(gè)概念?答案是可以的,就如同我們剛才遇到的問(wèn)題:
【度量值】2021年銷售 = CALCULATE([總銷售],'日期表'[年]=2021)?
我是不是也能寫成:
【度量值】改2021年銷售 = CALCULATE([總銷售],left('日期表'[年月],4)="2021")
// 取【年月】前4個(gè)字符是2021的,能實(shí)現(xiàn)的方法太多了
總之,盡量避開 calculate(calculate) 套娃的方式,就跟國(guó)家普法教育宣傳,目的是讓你遵紀(jì)守法,而不是讓你學(xué)習(xí)法律鉆空子。學(xué)原理也是一樣,學(xué)原理的目的就是避開原理。《權(quán)威指南》本課內(nèi)容給大家例舉了Calculate套娃原理,最終它也沒有建議你使用。
五、這里不用Keepfilters沒有發(fā)現(xiàn)區(qū)別
例如:計(jì)算月平均
【方法1】
【度量值】月平均 = AVERAGEX(DISTINCT('日期表'[年月]),[總銷售])
【方法2】
【度量值】月平均等價(jià) = AVERAGEX(KEEPFILTERS(DISTINCT('日期表'[月])),[總銷售])
【度量值】月平均等價(jià) = AVERAGEX(DISTINCT('日期表'[月]),[總銷售])
// 權(quán)威指南上使用了KEEPFILTERS,經(jīng)PowerBI 2021年10月版測(cè)試 是否使用KEEPFILTERS暫未發(fā)現(xiàn)區(qū)別,我個(gè)人理解Aceragex只是迭代函數(shù),度量值轉(zhuǎn)換了上下文,并沒有刪除日期表[月]這個(gè)列的篩選,所以是否使用Keepfilters恢復(fù)也沒有區(qū)別。如果我理解的不對(duì)歡迎大家留言。


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