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

Power BI之DAX神功:第2卷第7回 RankX排名优化与相对排名

2021-09-18 12:55 作者:孙兴华zz  | 我要投稿

一、排名优化

表名:Sheet1

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

【度量值】排名 = RANKX ( ALL ( Sheet1[商品] ), [总销售])

【度量值】排名优化1 = IF(HASONEVALUE('Sheet1'[商品]),[排名])

以上优化是我们最熟悉的让总计显示为空:IF+HASONEVALUE组合

现在我们换成多张表来试试:

<1> 第一种情况:

【度量值】总销售 = Sum('销售表'[销售]) 

【度量值】排名 = RANKX ( ALL ('销售表'[商品] ),[总销售])

【度量值】排名优化1 = IF(HASONEVALUE('销售表'[商品]),[排名])

行标题使用销售表中的商品列:

行标题使用商品表中的商品列:

为什么,使用商品表中的商品字段做行标题时,排名就不能显示了呢?

这是老生常谈的问题:

【度量值】排名 = RANKX ( ALL ('销售表'[商品] ),[总销售])

你的度量值上写着 ALL ('销售表'[商品] ),当你使用商品表中的商品字段筛选时,就等于在筛选排名,由于排名不能筛选,所以都显示为1

解决办法:修改度量值

【度量值】排名 = RANKX ( ALL ('商品表'[商品] ),[总销售])

以后就不要再纠结,什么时候用一端表,什么时候用多端表。这是你自己需求决定的。

天热了穿半袖,天冷了穿羽绒服。

你做分析,必先懂自己的业务,你要知道你自己在做什么。

<2> 第二种情况:

商品C没有销售,就不应该参加排名

我们还使用刚才的三个度量值测试:

系统会将没有销售的都默认是并列最后一个名次,我个人建议在数据分析前的数据清洗就搞定这些问题,如果你要留到DAX中解决。

这种情况,再增加一个条件,销售大于0才进行排名

两种写法均可,AND和OR只能是两个条件,但是&&和||可以多条件使用

详见《DAX神功》第1卷第18回

【度量值】排名优化2 = IF(AND( HASONEVALUE ('商品表'[商品] ), [总销售] >0),RANKX ( ALL ('商品表'[商品] ),[总销售]))

【度量值】排名优化2 = IF(HASONEVALUE ('商品表'[商品] ) && [总销售] >0,RANKX ( ALL ('商品表'[商品] ),[总销售]))

例如:有些门店为了销售数据好看,某商品1元进价,正常售价是1.5元,但是他以1.1元的价格销售,那的确好卖,你要是将1元进价的商品5毛钱卖,卖得更火,你的销售金额高了,但是毛利率很低,这恰恰反应你的经营水平有问题。所以我们在实际统计排名中,还会看毛利率,通常毛利率低于一定值就不会参加排名了(我商品卖了3万挣了5000元,你卖了300万没挣钱,还倒贴房屋水电人工费,你排第1名公平吗?)。这时就要判断第3个条件,例如[总销售]>0  && [毛利率]>某某%。这个某某根据自己公司实际情况而定。卖汽车的和卖菜的毛利率一定有很大差距。

二、RankX的第四和第五参数

众所周知,RankX共有五个参数,我们通过前两节课,理解了它前三个参数。后两个参数没有原理。知道怎么用就可以了。

电影《超时空救兵》有个片断

感兴趣的朋友可以去看一下这部电影

这哥们从唐朝穿越到现代,饿了,想吃烤羊腿

他问饭店服务员:需要多少银两?

服务员说:50

他拿出一锭银子,服务员说:我们这里不收银子,只收人民币

他说:请问哪里可以获取人民币?

服务员说:马路对面有个取款机可以获取。

他在取款机前排队,前面有一位中年男子用蓝牙耳机打电话,跟电话对方说你大爷的,就在这时,取款机中的钱吐出来了。

于是,他效仿前面的男子,对着取款机说:你大爷的。说了很多次,钱没出来。

无耐之下,他让后面的大妈先取钱,大妈一边跳舞一边取款

他又效仿大妈跳舞,钱还是没有出来,他愤怒了,拍打取款机。

..................

最后,他被精神病院带走了,临走时,他问医生:刚才是不是我步伐乱了?

医生说:没乱。他说:那为何没有获取到人民币?

医生说:机器坏了。

这个故事告诉大家,不用什么事都研究原理,取款机取钱,你插卡,输对密码,账户上有钱,自然可以取出来。不需要原理。

如果在RankX第四和第五参数上遇到问题,那可能是刚才的步伐乱了:)

笑完之后,我们回归正题:

<1> RankX第四参数:升序与降序

第四参数是排序规则:可以是0升序或1降序,也可以是ASC升序或DESC降序,省略这个参数默认降序。

降序:以下写法均可

【度量值】RANKX ( ALL ('商品表'[商品] ),[总销售])

【度量值】RANKX ( ALL ('商品表'[商品] ),[总销售],,1)

【度量值】RANKX ( ALL ('商品表'[商品] ),[总销售],,DESC)

升序:以下写法均可

【度量值】RANKX ( ALL ('商品表'[商品] ),[总销售],,0)

【度量值】RANKX ( ALL ('商品表'[商品] ),[总销售],,ASC)

网民:某哈(化名) 2021.1月初的提问

问:为何降序是从大到小,升序从小到大,什么原理?

答:原理应该是你的步伐乱了。

<2> RankX第五参数:中国排名与国际排名

《孙兴华讲PowerQuery教程 M函数 第一季》第11集中,我们用M函数的方法做过详细案例。你知道什么是中国排名?什么是国际排名?就可以了。

第五参数排序方法:Skip国际排序;Dense中国式排序。

两种排名

【度量值】国际排名 = RANKX(all(Sheet2[姓名]),[总销量],,,Skip)

【度量值】中国排名 = RANKX(all(Sheet2[姓名]),[总销量],,,Dense)

【度量值】普通排名 = RANKX(all(Sheet2[姓名]),[总销量])

如果你需要国际排名,不用刻意去写第五参数,他默认就是国际排名。你想呀,微软是美国的,他怎么可能默认使用中国排名呢?

至于国际排名和中国排名的解释,我与《The Definitive Guide to DAX》理解不同:

书中大致意思:中国排名先使用all(Sheet2[姓名])去重,而国际排名在迭代中生成 all(Sheet2[姓名])

Ps:我翻译水平有限,建议大家看中文版译者高飞前辈的翻译

我用数学方式理解:

都是先使用all(Sheet2[姓名])得到去重后的表,然后根据姓名聚合[总销量]这个度量值,以降序为例,找到最大值10,不管它有几个10,所有最大值名次为1。接下来两种排名各有自己的方法:

中国排名:从没有标记名次的销量中找到最大值,名次=上一个名次+1。

国际排名:从没有标记名次的销量中找到最大值,统计上一个名次有几个重复的值,例如2个,相当于N=2,名次=上一个名次+N

三、RankX配合ALLSELECTED函数:

详见《DAX神功》第1卷第11回基础表函数之ALLSELECTED

ALLSELECTED(表):指定表所有列内部筛选全部取消,但外部筛选可以。

ALLSELECTED(表[列]):指定表指定列取消内部筛选,但外部筛选可以。

我们想实现矩阵行标题取消筛选,但是切片器(外部筛选)生效

例如:

【度量值】普通排名 = RANKX(ALL(Sheet2[姓名]),[总销量])

【度量值】相对排名 = RANKX(ALLSELECTED(Sheet2[姓名]),[总销量])

在没有使用外部筛选器(如:切片器)时,他们效果相同

但是使用外部筛选器(如:切片器)时

我筛选张三、王五、邓七  

【1】普通排名因为使用的是ALL(列)内部与外部筛选器都不能筛选,所以他们各自原本名次是多少仍然是多少。所以称之为绝对排名。

【2】但是,我选了这三个人,我想看被选择的这三个人,他们之间的名次,就是相对排名。相对排名因为使用的是ALLSELECTED(列)内部筛选器不能筛选,但是外部筛选器可以筛选。

举个简单的例子:

14亿中国人财富大排队。第1名~第14亿....名,每个人都有自己的名次。

现在,我从14亿中国人中,提取3个人。

某云、某化腾、某兴华,他们三人还要在排出一个名次。

也许在14亿人中,某云第2,某化腾第5,某兴华第13亿9千万

但是,如果筛选这三个人出来比:某云第1,某化腾第2,某兴华第3

Ps:就像初始状态的虚竹一样就是个普通的小和尚,最后连“盗”三个号之后(无崖子,巫行云,李秋水),积聚200多年功力。兴华在14亿中国人中只是一个平凡的人,经过不断学习,掌握的知识越来越多,这离不开网友的支持,他在你问我答中不断成长和进步。兴华会继续努力,为大家传递更多知识。

下节课,我们来答网友问,解决多字段分层级的排名问题。

切记:下节课很重要,是实战哦!

《孙兴华讲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卷第7回 RankX排名优化与相对排名的评论 (共 条)

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