欢迎光临散文网 会员登陆 & 注册

Power BI之DAX神功:第2卷第8回 RankX在行上下文中的应用

2021-09-22 13:48 作者:孙兴华zz  | 我要投稿

当你理解了前面几节课的知识后,这节课的知识并不难。新建列对于新入门的小伙伴可以经常使用,因为直观,对你逻辑影响较小。但是老手使用的频率就低了。

一、【入门】新建列中的RankX

表名:Sheet1

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

【新建列】新列=[总销售]

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

【新建列】新列 = CALCULATE([总销售],ALL('Sheet1'[销售]))

我们需要相同姓名的人销售聚合!才能对每个人进行销售排名,所以要用ALL('Sheet1'[销售])

这句话,要记住,否则你7秒后就忘记了!RankX用在新建列时,这个概念很重要。

【新建列】排名 = rankx(all(Sheet1[姓名]),CALCULATE([总销售],ALL('Sheet1'[销售])))

默认降序,国际排名。

工作原理:

二、【进阶】新建列中的分层级RankX

1.简单版:

表名:Sheet2

【度量值】总销售2 = sum(Sheet2[销售])

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

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

2.复杂版

表名:Sheet3

【度量值】总销售 = 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等等

https://www.bilibili.com/read/cv10222110

Power BI之DAX神功:第2卷第8回 RankX在行上下文中的应用的评论 (共 条)

分享到微博请遵守国家法律