手把手教你利用PowerBI实现动态TOPN及其他

文/大脸猫
8年汽车行业数据分析经验,擅长跨行业快速理解业务并搭建模型,利用Power BI,Python等工具实现业务及报表自动化,相比技术更关注如何落实实际业务场景的解决方案。
最近在做企业内部培训的时候,碰到一个实际业务问题:

在竞争品牌分析的时候,同事制作了一个饼图,用于显示不同品牌的市场份额。

但是他需要动态选择时间或者细分市场,品牌实在太多了,如何让图表自动显示TOP3的品牌并将剩余的品牌归类到“其他品牌”中进行显示呢?

下面来复盘一下我们的解决方案,POWER BI的迷人之处在于永远不止一种方案或者思路,如果你有更好的解决方法,欢迎分享。

为了便于大家理解,我将数据极可能的简化,避免数据认识负担。

假设我有这样一份数据,包含品牌,销量,以及年月。

初步制作了这样一张饼图:

现在想实现的目标是:

当动态选择年月切片器的时候,在这个图中只显示出当月TOP 3销量的品牌,剩下的品牌自动归类到“其余品牌”中进行计算。

看似非常清晰简单的需求对不对,但是实现起来是不是感觉无处下手?

我们来理清一下思路:

问题1:动态图例问题,如何实现TOP 3品牌的显示?

第一反应是利用筛选器,以销量作为判断基准,实现TOP 3,于是我尝试了一下:

这样是实现了动态显示TOP 3的品牌,但是剩下的其余品牌怎么办?

于是换个思路,我们想要动态显示TOP 3和剩余品牌,是不是可以翻译一下?

永远只显示销量前三的品牌,再加一个品牌,它的名字叫“其它品牌”?

让它永远显示 TOP 4个品牌,其中人工赋予“其他”这个品牌永远为最大销量?

感觉这个思路有戏,开始尝试起来。

要想实现这个效果,那我要首先建立一个含"其他品牌"的全量品牌数据

选择新建表,使用Union和Values函数即可。

然后建立这个品牌和销量表之间的关系:

接下来做一个简单的测试:

先快速建立一个表格,使用刚刚建立的品牌字段加销量字段:

可以看到“其他品牌”暂时没有显示出来,因为它本身没有意义,自然筛选不出销量数据。

这里我们编写一个新的销量度量值TOP4品牌销量标准,将“其他品牌”赋予销售量数据,它将仅用于我们动态筛选TOP4品牌:

TOP4品牌销量标准 =
IF(
SELECTEDVALUE('全品牌数据'[品牌]) = "其他品牌", 10000,
SUM('分品牌销量'[销量])
)

这样我们就成功赋予了”其他品牌”一个销量,这个销量我们设置为不可能实现的最大值,比如10000,现在我们再来尝试一下:

成功了,现在我们基于TOP4品牌销量标准筛选前4个品牌,成功实现了每次都动态显示销量前3品牌的名称加上“其他品牌”。

接下来新的问题来了:

问题2:如何让其他品牌显示正确的销量?

我的思路是编写一个度量值,利用变量先计算出TOP3的度量值,再反减出其他品牌的合计值即可:

1、全品牌销量数据应该很好写,用Calculate + ALL。
2、TOP3品牌的销量数据需要用到TOPN,TOPN可以理解为一个迭代函数,迭代“全品牌数据”这张表,同时基于刚刚写的[TOP4品牌销量标准],取出TOP 4的品牌(由于人工赋予了一个“其他品牌”销量值,所以在取出TOP3品牌的时候需要考虑在内)。
3、最后用一个IF和SELECTEDVALUE实现“其他品牌”销量的正确显示。

效果如下:

大功告成!成功实现了动态显示TOP3和其他品牌的正确销量!

接下来就可以将表格改成饼图啦:

这其实属于POWER BI常用的一种套路,利用度量值巧妙实现一些比较个性化的需求。

接下来我们再来拓展一下,能不能实现动态显示TOPN品牌并自动将剩余品牌归类呢?

要实现动态TOPN,首先肯定是要先建立一个参数表,点击新建参数:

有了参数,和刚才相同的思路:

问题1:动态图例问题,如何实现TOP N品牌的显示?

可以翻译一下问题:如何只显示N+1个品牌,其中1个是永远排第一的“其他品牌”, 剩下的是销量排名前N的品牌?

这里需要继续借助一个辅助度量值排名了,新建度量值:

这里利用刚刚建立的[TOP4品牌销量标准]这个度量值,还记得吗,这个度量值是为了赋予“其他品牌”最大销量值。

这里用到了一个小技巧,我们要把所有排名在N+1之后的品牌全部赋予一个固定排名数字:0,然后在筛选器里屏蔽这个排名为0的品牌,这样就成功实现了我们的目标。

问题2:如何让其他品牌显示正确的销量?

这个就简单啦,还是利用我们刚刚建立的[销量(含其他品牌)]度量值,只要把刚刚设置的数字3替换成参数N即可。

我们来看一看效果:

至此,还有一个细节问题,现在的图例默认是按照销量大小排序的,如果我想让“其他品牌”永远排序最后一位,该如何实现呢?

很简单,还是利用度量值,我们新建一个度量值叫做[品牌排序参照]:

品牌排序参照 =
IF(SELECTEDVALUE('全品牌数据'[品牌]) = "其他品牌",
0, [销量(含其他品牌)])
然后将这个度量值拖到工具提示,选择排序方式按照[品牌排序参照]排序。
最终效果如下:

好啦,目标达成,现在你也可以动手试试,能否帮助你解决一些类似的日常业务场景吧!

(0)

相关推荐