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

Power BI之DAX神功:第2卷第6回 让RankX的第3参数不再神秘

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

《孙兴华讲PowerBI火力全开》笔记25课已经提到过RankX的第三参数

那一年我跟大家承诺过,一定会在火力全开的后续版本中给大家讲解。

现在是我们实现承诺的时刻!

有如下表:

表名:Sheet1

需求:60分以下不及格,60~85分以下及格,85~90分以下良好,90分及以上优秀

《DAX神功》第1卷第3回介绍了表构造函数

思路:

【新建表】表 = SelectColumns({0,60,85,90},"范围",[Value])

【度量值】总分=Sum('Sheet1'[分数])

【度量值】找位置 = rankx('表','表'[范围],[总分])

Ps:找位置这个度量值,在{0,60,85,90}这张表中,找到每个分数的位置,并编号

运算示意图

【度量值】

评价 = 

       switch(TRUE(),

                 [找位置]=1,"优秀",

                 [找位置]=2,"良好",

                 [找位置]=3,"及格",

        "不及格")

当然以上步骤是我们思考的过程,我们可以将这些步骤写在一起:

评价2 = 

    VAR a= sum(Sheet1[分数])

    VAR b= rankx({0,60,85,90},[Value],a)

return

    switch(TRUE(),

            b=1,"优秀",

            b=2,"良好",

            b=3,"及格",

        "不及格")

可能有些小伙伴会有疑问,自定义分段的表我们可以使用表构造函数{}处理

如果我想创建一个表,例如:从0到100,步长为20,需要手写吗?不需要

【新建表】表 2 = GENERATESERIES(0,100,20)

如果需要更换字段名,详见《DAX神功》第1卷第3回

【新建表】表 2 = SelectColumns(GENERATESERIES(0,100,20),"范围",[Value])

《The Definitive Guide to DAX》书中对RankX第三参数解释:(若我翻译不佳请见谅,你们可以参考中文版译者高飞前辈的翻译)

RankX第三参数是标量表达式,作用是:使用不同的表达式分别计算查找表和用于排序的值。

也许是我翻译问题,这句话我第一次看到时,不易理解。

我讲一下我的理解方式,并附证明:

现在我们更换一张有重复姓名的表来分析:

表名:Sheet2

需求:销售90以上优秀,85以上良好,60以上及格,60以下不及格

【度量值】

评价 = 

        VAR a= sum(Sheet2[销量])

        VAR b= rankx({0,60,85,90},[Value],a)

return

       switch(TRUE(),

                b=1,"优秀",

                b=2,"良好",

                b=3,"及格",

       "不及格")

细心的小伙伴会发现一个问题:孙兴华是不是上节课讲错了?他不是说过RankX不能在矩阵上筛选,这张表中孙兴华有两次销售,分别是51和9,这不就是分组聚合了吗?加在一起是60,正好及格。

接下来,孙兴华给你们证明,他是对的!

很多人会想起上节课的 【度量值】排名2 = RANKX(ALL(Sheet1[商品]),[总销售]) 

你别忘记,上节课你的行标题上面的商品字段和你排名2中的公式sheet1是一张表(自己表中的字段可以筛选自己的表),如果有多张表,且一对多关系,那么一端也可以筛选多端。

我们再看今天这张表:

表名:Sheet2

【度量值】总销量=Sum(Sheet2[销量])

我们以下面的公式为例,{0,60,85,90} 这张表跟你的Sheet2没有毛关系吧?也没有连线吧?这是我用表构造函数造出来的。

【度量值】等级排名 = rankx({0,60,85,90},[Value],[总销量])

所以,姓名字段是不能筛选{0,60,85,90} 这张表的。

我问你:不能筛选这不就相当于all吗?

我们继续观察,下面两个度量值(第1个度量值是我们上节课用到的)

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

【度量值】等级排名 = RANKX({0,60,85,90},[Value],[总销量])

由于{0,60,85,90}跟我们Sheet2这张表无关,故不能筛选,相当于all函数,且第2参数指定了它的列,就相当于ALL(列)

现在Rankx第三参数的秘密已经不再是秘密了

两个参数时的   RankX(ALL(列),[度量值])   等价于    RankX(构造表,列,[度量值])

口说无凭,谁指证,谁举证,我来证明:

表名:Sheet3

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

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

【度量值】排名2 = RANKX({3,5,7},[Value],[总销售]) 

重点:可以聚合度量值的销量、金额、分数等数值,但是不能聚合排名的名次值!2元+5元=7元,1个+2个=3个,第3名+第5名=不会算

关于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卷第6回 让RankX的第3参数不再神秘的评论 (共 条)

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