Power BI之DAX神功:第2卷第8回 RankX在行上下文中的應(yīng)用
當(dāng)你理解了前面幾節(jié)課的知識(shí)后,這節(jié)課的知識(shí)并不難。新建列對(duì)于新入門的小伙伴可以經(jīng)常使用,因?yàn)橹庇^,對(duì)你邏輯影響較小。但是老手使用的頻率就低了。
一、【入門】新建列中的RankX

【度量值】總銷售 = SUM ( 'Sheet1'[銷售])
【新建列】新列=[總銷售]

因?yàn)槎攘恐堤焐哂泻Y選功能的特性,我們沒辦法聚合銷售,就沒有辦法按姓名排名,所以我們要使用ALL(列),指定列取消篩選功能
【新建列】新列 = CALCULATE([總銷售],ALL('Sheet1'[銷售]))

我們需要相同姓名的人銷售聚合!才能對(duì)每個(gè)人進(jìn)行銷售排名,所以要用ALL('Sheet1'[銷售])
這句話,要記住,否則你7秒后就忘記了!RankX用在新建列時(shí),這個(gè)概念很重要。
【新建列】排名 = rankx(all(Sheet1[姓名]),CALCULATE([總銷售],ALL('Sheet1'[銷售])))
默認(rèn)降序,國際排名。

工作原理:

二、【進(jìn)階】新建列中的分層級(jí)RankX
1.簡單版:

【度量值】總銷售2 = sum(Sheet2[銷售])
【新建列】排名 = RankX(all(Sheet2[名稱]),CALCULATE([總銷售2],ALL('Sheet2'[銷售])))

你會(huì)發(fā)現(xiàn),寫法與【入門】是一樣的,你理解它的工作原理后,秒懂:

2.復(fù)雜版

【度量值】總銷售 = SUM ( 'Sheet3'[銷售] )
【新建列】排名 = Rankx(ALL(Sheet3[名稱]), CALCULATE([總銷售],ALL('Sheet3'[銷售])))
這個(gè)原理就不用講了,同理【進(jìn)階】簡單版,無論有多少個(gè)列,都是分組的概念

如果我們讓產(chǎn)地就是個(gè)擺設(shè),只顯示但不影響排名
【新建列】排名 = Rankx(ALL(Sheet3[名稱],Sheet3[產(chǎn)地]), CALCULATE([總銷售],ALL('Sheet3'[銷售])))
《DAX神功》答網(wǎng)友問06 我們同答了度量值中使用RankX時(shí)處理這個(gè)問題的方法,同理可以應(yīng)用到新建列上。也可以使用REMOVEFILTERS

三、答網(wǎng)友問:
問1:為什么我們看到有些人用ALLEXCEPT,而你使用ALL呢?
答1:《DAX神功》第1卷第8回我們講過
ALL(列)? 指定表指定列取消內(nèi)部與外部篩選功能
ALLEXCEPT('表',列)? ?指定表指定列以外的列取消內(nèi)部與外部篩選功能
如上圖所示,我們的公式可以寫成:
【度量值】排名 = RANKX (ALL ( 'Sheet3'[名稱],Sheet3[產(chǎn)地] ),CALCULATE ( [總銷售], ALLEXCEPT('Sheet3','Sheet3'[分類],'Sheet3'[名稱])))
我會(huì)根據(jù)具體情況使用這兩個(gè)函數(shù)。

問2:我在網(wǎng)上看到一個(gè)案例,人家使用了第3參數(shù),請(qǐng)問這是什么原理?如下圖:

答2:因?yàn)槲铱床欢@個(gè)案例的排名需求,如果你們誰能看懂需求,評(píng)論區(qū)留言。
能給我講清楚排名需求,我就能講清楚公式原理。換個(gè)方式,如果你問我,8+6=2是什么原理?我不能說,你將+號(hào)看成-號(hào)了,也許你有特殊的業(yè)務(wù)需求。
你舉的這個(gè)案例,我個(gè)人能想到以下幾種排名情況:
情況一:按品牌排名
【新建列】分配銷售 = CALCULATE([總銷售],all('FACT'[銷售],'FACT'[城市]))
Ps: 這是讓看清楚步驟,我們需要按品牌進(jìn)行銷售聚合,才能排名

【新建列】品牌排名 = rankx(all('FACT'[品牌]),CALCULATE([總銷售],all('FACT'[銷售],'FACT'[城市])))

Ps: 也可以使用ALLEXCEPT
【新建列】品牌排名 = rankx(all('FACT'[品牌]),CALCULATE([總銷售],ALLEXCEPT('FACT','FACT'[品牌])))

情況二:按城市排名(跟情況一很相似)
【新建列】分配銷售 = CALCULATE([總銷售],all('FACT'[銷售],'FACT'[品牌]))

【新建列】品牌排名 = rankx(all('FACT'[城市]),CALCULATE([總銷售],all('FACT'[銷售],'FACT'[品牌])))

情況三:按品牌和城市排名(品牌和城市相同的算一組,例如:華為~深圳)
【新建列】分配銷售=CALCULATE([總銷售],all('FACT'[銷售]))

【新建列】排名 = rankx(all('FACT'[品牌],'FACT'[城市]),CALCULATE([總銷售],all('FACT'[銷售])))

情況四:按品牌分組,對(duì)每組下的城市按銷售排名
Ps: 本文章,二、【進(jìn)階】新建列中的RankX? 1.簡單版
【新建列】排名 = RankX(all('FACT'[城市]),CALCULATE([總銷售],ALL('FACT'[銷售])))

情況五:按城市分組,對(duì)每組下的品牌按銷售排名
Ps: 本文章,二、【進(jìn)階】新建列中的RankX? 1.簡單版
【新建列】排名 = RankX(all('FACT'[品牌]),CALCULATE([總銷售],ALL('FACT'[銷售])))

情況六:只看銷售,從大到小排名
最簡單的方法:
【新建列】排名 = rankx(all('FACT'[品牌],'FACT'[城市],'FACT'[銷售]),[總銷售])
復(fù)雜的方法:
因?yàn)?#34;FACT"這張表是多端表,如果只有這一張表,且你需要對(duì)每條記錄按銷售排序
需要先到PowerQuery中增加索引列,再進(jìn)行排名。
【新建列】排名 = rankx(all('FACT'[索引],'FACT'[品牌],'FACT'[城市]),CALCULATE([總銷售],all('FACT'[銷售])))

當(dāng)然,在《DAX神功》答網(wǎng)友問06時(shí)我們也說過:用REMOVEFILTERS也可以
【新建列】排名 = rankx(all('FACT'[索引]),CALCULATE([總銷售],all('FACT'[銷售]),REMOVEFILTERS('FACT'[品牌],'FACT'[城市])))


DAX非常靈活,靈活到你頭暈眼花,當(dāng)你在網(wǎng)上見到各種方法時(shí),不要輕易的說人家思路不對(duì),坐井觀天,井口的大小就是天的大小。
下節(jié)課,是RankX部分的最后一節(jié)課,小伙伴不要錯(cuò)過哦!

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