Power BI之DAX神功:第2卷第8回 RankX在行上下文中的应用
当你理解了前面几节课的知识后,这节课的知识并不难。新建列对于新入门的小伙伴可以经常使用,因为直观,对你逻辑影响较小。但是老手使用的频率就低了。
一、【入门】新建列中的RankX

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

因为度量值天生具有筛选功能的特性,我们没办法聚合销售,就没有办法按姓名排名,所以我们要使用ALL(列),指定列取消筛选功能
【新建列】新列 = CALCULATE([总销售],ALL('Sheet1'[销售]))

我们需要相同姓名的人销售聚合!才能对每个人进行销售排名,所以要用ALL('Sheet1'[销售])
这句话,要记住,否则你7秒后就忘记了!RankX用在新建列时,这个概念很重要。
【新建列】排名 = rankx(all(Sheet1[姓名]),CALCULATE([总销售],ALL('Sheet1'[销售])))
默认降序,国际排名。

工作原理:

二、【进阶】新建列中的分层级RankX
1.简单版:

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

你会发现,写法与【入门】是一样的,你理解它的工作原理后,秒懂:

2.复杂版

【度量值】总销售 = SUM ( 'Sheet3'[销售] )
【新建列】排名 = Rankx(ALL(Sheet3[名称]), CALCULATE([总销售],ALL('Sheet3'[销售])))
这个原理就不用讲了,同理【进阶】简单版,无论有多少个列,都是分组的概念

如果我们让产地就是个摆设,只显示但不影响排名
【新建列】排名 = Rankx(ALL(Sheet3[名称],Sheet3[产地]), CALCULATE([总销售],ALL('Sheet3'[销售])))
《DAX神功》答网友问06 我们同答了度量值中使用RankX时处理这个问题的方法,同理可以应用到新建列上。也可以使用REMOVEFILTERS

三、答网友问:
问1:为什么我们看到有些人用ALLEXCEPT,而你使用ALL呢?
答1:《DAX神功》第1卷第8回我们讲过
ALL(列) 指定表指定列取消内部与外部筛选功能
ALLEXCEPT('表',列) 指定表指定列以外的列取消内部与外部筛选功能
如上图所示,我们的公式可以写成:
【度量值】排名 = RANKX (ALL ( 'Sheet3'[名称],Sheet3[产地] ),CALCULATE ( [总销售], ALLEXCEPT('Sheet3','Sheet3'[分类],'Sheet3'[名称])))
我会根据具体情况使用这两个函数。

问2:我在网上看到一个案例,人家使用了第3参数,请问这是什么原理?如下图:

答2:因为我看不懂这个案例的排名需求,如果你们谁能看懂需求,评论区留言。
能给我讲清楚排名需求,我就能讲清楚公式原理。换个方式,如果你问我,8+6=2是什么原理?我不能说,你将+号看成-号了,也许你有特殊的业务需求。
你举的这个案例,我个人能想到以下几种排名情况:
情况一:按品牌排名
【新建列】分配销售 = CALCULATE([总销售],all('FACT'[销售],'FACT'[城市]))
Ps: 这是让看清楚步骤,我们需要按品牌进行销售聚合,才能排名

【新建列】品牌排名 = 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'[销售])))

情况四:按品牌分组,对每组下的城市按销售排名
Ps: 本文章,二、【进阶】新建列中的RankX 1.简单版
【新建列】排名 = RankX(all('FACT'[城市]),CALCULATE([总销售],ALL('FACT'[销售])))

情况五:按城市分组,对每组下的品牌按销售排名
Ps: 本文章,二、【进阶】新建列中的RankX 1.简单版
【新建列】排名 = RankX(all('FACT'[品牌]),CALCULATE([总销售],ALL('FACT'[销售])))

情况六:只看销售,从大到小排名
最简单的方法:
【新建列】排名 = rankx(all('FACT'[品牌],'FACT'[城市],'FACT'[销售]),[总销售])
复杂的方法:
因为"FACT"这张表是多端表,如果只有这一张表,且你需要对每条记录按销售排序
需要先到PowerQuery中增加索引列,再进行排名。
【新建列】排名 = rankx(all('FACT'[索引],'FACT'[品牌],'FACT'[城市]),CALCULATE([总销售],all('FACT'[销售])))

当然,在《DAX神功》答网友问06时我们也说过:用REMOVEFILTERS也可以
【新建列】排名 = rankx(all('FACT'[索引]),CALCULATE([总销售],all('FACT'[销售]),REMOVEFILTERS('FACT'[品牌],'FACT'[城市])))


DAX非常灵活,灵活到你头晕眼花,当你在网上见到各种方法时,不要轻易的说人家思路不对,坐井观天,井口的大小就是天的大小。
下节课,是RankX部分的最后一节课,小伙伴不要错过哦!

《孙兴华讲PowerBI火力全开》PowerBI必学课程
https://www.bilibili.com/video/BV1qa4y1H7wp
《DAX神功》文字版合集:
https://www.bilibili.com/read/readlist/rl442274
《DAX神功》视频版合集:
https://www.bilibili.com/video/BV1YE411E7p3
PowerBI(DAX函数)、PowerQuery(M函数)、Python办公自动化、Python爬虫、Python数据分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等