|
之前介绍过如何利用PowerBI实现TOPN和其他的分析,如果你还没有看过,请先看看这篇文章:
把所有的产品分成TOPN和其他两种类型,并且列出两种类型的明细数据,这个效果仍然以PowerBI星球案例模型为例来实现的,操作步骤如下:
1. 建立模型
首先用CROSSJOIN函数建立一个含有”TOPN”和”其他”字段和产品表的笛卡尔积表:
辅助表 =
CROSSJOIN(
SELECTCOLUMNS(‘产品表’,”产品名称”,[产品名称]),
SELECTCOLUMNS({“TOPN”,”其他”},”类型”,[Value])
)
效果如下:
排名 = RANKX( ALL(‘辅助表'[产品]) , [销售额] )
在这个度量值的基础上就可以写TOPN和其他的度量值了:
SELECTEDVALUE(‘辅助表'[类型])=”TOPN”&&[排名]<=[参数 值],[销售额],
SELECTEDVALUE(‘辅助表'[类型])=”其他”&&[排名]>[参数 值],[销售额]
这个DAX逻辑主要就是判断,相对于之前的做法和公式,要简单很多,其中[参数 值]是创建的参数自动生成的,和之前文章介绍的一致。
这里用个矩阵来展示TOPN和其他的效果,将辅助表的类型和产品名称放到【行】,上面建的度量值[销售额 TOPN和其他]放到【值】中,就有了下面的效果:
上面的矩阵,TOPN和其他的分类没有问题,明细行的数据也没有问题,但是小计和总计的数据不对,这里再写个度量值进行修正:
SUMX(VALUES(‘辅助表'[产品名称]),[销售额 TOPN和其他]),
CALCULATE([销售额],ALL(‘产品表’))
这个度量值让每个类型的小计等于明细之和,并且让最后的总计等于所有产品的销售额之和,把这个度量值替代前面的度量值,放到矩阵的【值】中:
不过还有个排序的问题,如果按这个值排序,当TOPN的值比其他的值小时,它会排到”其他”的下面,比如参数设为3,就会出现这个问题:
解决这个问题也很简单,就是将前面写的[销售额 TOPN和其他]也放到矩阵的【值】中,用来排序:
然后拖动这一列,把它隐藏掉,就可以实现TOPN和其他的分类和展示,动态的效果见本文开头的动图。
|