之前介绍过如何利用PowerBI实现TOPN和其他的分析,如果你还没有看过,请先看看这篇文章:
Power BI业务分析 | 动态TOPN和其他
本文介绍另一种简单的思路,效果如下:
把所有的产品分成TOPN和其他两种类型,并且列出两种类型的明细数据,这个效果仍然以PowerBI星球案例模型为例来实现的,操作步骤如下:

1. 建立模型

首先用CROSSJOIN函数建立一个含有”TOPN”和”其他”字段和产品表的笛卡尔积表:

辅助表 =

CROSSJOIN(

    SELECTCOLUMNS(‘产品表’,”产品名称”,[产品名称]),

    SELECTCOLUMNS({“TOPN”,”其他”},”类型”,[Value])

)

告别复杂函数,PowerBI 轻松搞定 TopN及其他数据呈现!

效果如下:


然后这个表与产品表建立双向关系:

2. 建度量值
首先建一个排名度量值:

排名 = RANKX( ALL(‘辅助表'[产品]) , [销售额] )

在这个度量值的基础上就可以写TOPN和其他的度量值了:
销售额 TOPN和其他 =
SWITCH(
    TRUE,
    SELECTEDVALUE(‘辅助表'[类型])=”TOPN”&&[排名]<=[参数 值],[销售额],
    SELECTEDVALUE(‘辅助表'[类型])=”其他”&&[排名]>[参数 值],[销售额]
)
这个DAX逻辑主要就是判断,相对于之前的做法和公式,要简单很多,其中[参数 值]是创建的参数自动生成的,和之前文章介绍的一致。

3. 可视化展现
这里用个矩阵来展示TOPN和其他的效果,将辅助表的类型和产品名称放到【行】,上面建的度量值[销售额 TOPN和其他]放到【值】中,就有了下面的效果:
关于矩阵格式的调整和美化可参考:灵活运用PowerBI内置功能,重塑表格呈现
上面的矩阵,TOPN和其他的分类没有问题,明细行的数据也没有问题,但是小计和总计的数据不对,这里再写个度量值进行修正:
TOPN和其他修正 =
IF(
    ISINSCOPE(‘辅助表'[类型]),
    SUMX(VALUES(‘辅助表'[产品名称]),[销售额 TOPN和其他]),
    CALCULATE([销售额],ALL(‘产品表’))
)
这个度量值让每个类型的小计等于明细之和,并且让最后的总计等于所有产品的销售额之和,把这个度量值替代前面的度量值,放到矩阵的【值】中:
这样处理以后,看起来小计和总计也都准确显示了。
不过还有个排序的问题,如果按这个值排序,当TOPN的值比其他的值小时,它会排到”其他”的下面,比如参数设为3,就会出现这个问题:

解决这个问题也很简单,就是将前面写的[销售额 TOPN和其他]也放到矩阵的【值】中,用来排序:

然后拖动这一列,把它隐藏掉,就可以实现TOPN和其他的分类和展示,动态的效果见本文开头的动图。