Power BI之DAX神功:第2卷第6回 讓RankX的第3參數(shù)不再神秘
《孫興華講PowerBI火力全開(kāi)》筆記25課已經(jīng)提到過(guò)RankX的第三參數(shù)
那一年我跟大家承諾過(guò),一定會(huì)在火力全開(kāi)的后續(xù)版本中給大家講解。
現(xiàn)在是我們實(shí)現(xiàn)承諾的時(shí)刻!
有如下表:

需求:60分以下不及格,60~85分以下及格,85~90分以下良好,90分及以上優(yōu)秀
《DAX神功》第1卷第3回介紹了表構(gòu)造函數(shù)
思路:
【新建表】表 = SelectColumns({0,60,85,90},"范圍",[Value])

【度量值】總分=Sum('Sheet1'[分?jǐn)?shù)])
【度量值】找位置 = rankx('表','表'[范圍],[總分])

Ps:找位置這個(gè)度量值,在{0,60,85,90}這張表中,找到每個(gè)分?jǐn)?shù)的位置,并編號(hào)

【度量值】
評(píng)價(jià) =?
? ? ? ?switch(TRUE(),
? ? ? ? ? ? ? ? ?[找位置]=1,"優(yōu)秀",
? ? ? ? ? ? ? ? ?[找位置]=2,"良好",
? ? ? ? ? ? ? ? ?[找位置]=3,"及格",
? ? ? ? "不及格")

當(dāng)然以上步驟是我們思考的過(guò)程,我們可以將這些步驟寫(xiě)在一起:

評(píng)價(jià)2 =?
? ? VAR a= sum(Sheet1[分?jǐn)?shù)])
? ? VAR b= rankx({0,60,85,90},[Value],a)
return
? ? switch(TRUE(),
? ? ? ? ? ? b=1,"優(yōu)秀",
? ? ? ? ? ? b=2,"良好",
? ? ? ? ? ? b=3,"及格",
? ? ? ? "不及格")


可能有些小伙伴會(huì)有疑問(wèn),自定義分段的表我們可以使用表構(gòu)造函數(shù){}處理
如果我想創(chuàng)建一個(gè)表,例如:從0到100,步長(zhǎng)為20,需要手寫(xiě)嗎?不需要
【新建表】表 2 = GENERATESERIES(0,100,20)

如果需要更換字段名,詳見(jiàn)《DAX神功》第1卷第3回
【新建表】表 2 = SelectColumns(GENERATESERIES(0,100,20),"范圍",[Value])

《The Definitive Guide to DAX》書(shū)中對(duì)RankX第三參數(shù)解釋:(若我翻譯不佳請(qǐng)見(jiàn)諒,你們可以參考中文版譯者高飛前輩的翻譯)
RankX第三參數(shù)是標(biāo)量表達(dá)式,作用是:使用不同的表達(dá)式分別計(jì)算查找表和用于排序的值。
也許是我翻譯問(wèn)題,這句話我第一次看到時(shí),不易理解。
我講一下我的理解方式,并附證明:
現(xiàn)在我們更換一張有重復(fù)姓名的表來(lái)分析:

需求:銷售90以上優(yōu)秀,85以上良好,60以上及格,60以下不及格
【度量值】
評(píng)價(jià) =?
? ? ? ? VAR a= sum(Sheet2[銷量])
? ? ? ? VAR b= rankx({0,60,85,90},[Value],a)
return
? ? ? ?switch(TRUE(),
? ? ? ? ? ? ? ? b=1,"優(yōu)秀",
? ? ? ? ? ? ? ? b=2,"良好",
? ? ? ? ? ? ? ? b=3,"及格",
? ? ? ?"不及格")

細(xì)心的小伙伴會(huì)發(fā)現(xiàn)一個(gè)問(wèn)題:孫興華是不是上節(jié)課講錯(cuò)了?他不是說(shuō)過(guò)RankX不能在矩陣上篩選,這張表中孫興華有兩次銷售,分別是51和9,這不就是分組聚合了嗎?加在一起是60,正好及格。
接下來(lái),孫興華給你們證明,他是對(duì)的!
很多人會(huì)想起上節(jié)課的 【度量值】排名2 = RANKX(ALL(Sheet1[商品]),[總銷售])?
你別忘記,上節(jié)課你的行標(biāo)題上面的商品字段和你排名2中的公式sheet1是一張表(自己表中的字段可以篩選自己的表),如果有多張表,且一對(duì)多關(guān)系,那么一端也可以篩選多端。
我們?cè)倏唇裉爝@張表:

【度量值】總銷量=Sum(Sheet2[銷量])
我們以下面的公式為例,{0,60,85,90} 這張表跟你的Sheet2沒(méi)有毛關(guān)系吧?也沒(méi)有連線吧?這是我用表構(gòu)造函數(shù)造出來(lái)的。
【度量值】等級(jí)排名 = rankx({0,60,85,90},[Value],[總銷量])
所以,姓名字段是不能篩選{0,60,85,90} 這張表的。
我問(wèn)你:不能篩選這不就相當(dāng)于all嗎?
我們繼續(xù)觀察,下面兩個(gè)度量值(第1個(gè)度量值是我們上節(jié)課用到的)
【度量值】排名2 = RANKX(ALL(Sheet1[商品]),[總銷售])?
【度量值】等級(jí)排名 = RANKX({0,60,85,90},[Value],[總銷量])
由于{0,60,85,90}跟我們Sheet2這張表無(wú)關(guān),故不能篩選,相當(dāng)于all函數(shù),且第2參數(shù)指定了它的列,就相當(dāng)于ALL(列)
現(xiàn)在Rankx第三參數(shù)的秘密已經(jīng)不再是秘密了
兩個(gè)參數(shù)時(shí)的???RankX(ALL(列),[度量值])? ?等價(jià)于? ? RankX(構(gòu)造表,列,[度量值])

口說(shuō)無(wú)憑,誰(shuí)指證,誰(shuí)舉證,我來(lái)證明:


【度量值】總銷售 = sum(Sheet3[銷售])
【度量值】排名1 = RANKX(ALL(Sheet3[商品]),[總銷售])?
【度量值】排名2 = RANKX({3,5,7},[Value],[總銷售])?


重點(diǎn):可以聚合度量值的銷量、金額、分?jǐn)?shù)等數(shù)值,但是不能聚合排名的名次值!2元+5元=7元,1個(gè)+2個(gè)=3個(gè),第3名+第5名=不會(huì)算
關(guān)于RankX的更多知識(shí),我們下節(jié)課再說(shuō)!
《孫興華講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爬蟲(chóng)、Python數(shù)據(jù)分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等
https://www.bilibili.com/read/cv10222110