美文网首页
如何解决RANKX排名异常的问题?

如何解决RANKX排名异常的问题?

作者: 麦浪_011e | 来源:发表于2021-02-04 16:02 被阅读0次

前两天处理一张报表,需要从销售数量和销售金额两个角度分别对产品进行排名。希望报表显示成如下样子:

开始的时候,写的度量值DAX表达式分别如下:

产品销售数量排行 = RANKX(ALL('门店线下销量'[产品名称]), 'T_度量值'[07_产品销售数量],,DESC,SKIP)

产品销售金额排行 = RANKX(ALL('门店线下销量'[产品名称]), 'T_度量值'[14_销售金额],,DESC,SKIP)

这两个表达式都带来了同一个问题,行标签仅为【产品名称】时,所得结果都是正确的:

但是,当我增加行标签字段【产品类型】,这时发现结果让人看不懂了:

我们本来还想把每款产品的单价也放到行标签的位置,然而不解决上面这个问题,得到的结果压根就是错误的。当时认定,RANKX表达式一定是受新增加的行标签字段【产品类型】的影响,解决的办法就是要移除掉这个影响。尝试修改了参数,都很然并卵。时间的原因,最后先用了折中的办法——就不用显示对应的【产品类型】和【单价】。只是,心里终究是留着疙瘩。

冥冥中感觉DAX代码的始作俑者一定不会不考虑到这种应用场景:我要显示每个产品的总排名,这个排名基于全部产品,不考虑该产品属于哪个产品类型或者什么价格。带着这个问题,在https://dax.guide/查到了适用这种场景的函数:REMOVEFILTERS,网址为REMOVEFILTERS – DAX Guide,语法如下:

Removefilters,直译过来就是移除筛选的意思,而且这里的单词filters还用了复数形式,那么,顾名思义,就是移除一个或者多个筛选。函数功能介绍中Clear filters from specified tables or columns(移除特定表或特定列的筛选)正好诠释了这一点。这个函数的第一个参数可以是表,可以是列,甚至可以不填。但试了一下,如果不填参数,它就默认去除整个表的筛选。第二个及第二个之后的参数只能是列,而且不能是其它表的列。最后强调,Removefilters跟ALL功能相似,但不能单独使用,而且一定是跟Calculate搭配使用。现在我们来看下它的效果,DAX表达式改成:

产品销售数量排行 =

CALCULATE(

RANKX(ALL('门店线下销量'[产品名称]),'T_度量值'[07_产品销售数量],,DESC,SKIP),

REMOVEFILTERS('门店线下销量'[产品类型],'门店线下销量'[单价])

)

产品销售金额排行 =

CALCULATE(

RANKX(ALL('门店线下销量'[产品名称]),'T_度量值'[14_销售金额],,DESC,SKIP),

REMOVEFILTERS('门店线下销量'[产品类型],'门店线下销量'[单价])

)

做了这样的修改,得到的结果是本文开始的表了。你get到了没有?试试看

相关文章

网友评论

      本文标题:如何解决RANKX排名异常的问题?

      本文链接:https://www.haomeiwen.com/subject/alfbtltx.html