手把手教你利用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的度量值,再反减出其他品牌的合计值即可:
效果如下:
大功告成!成功实现了动态显示TOP3和其他品牌的正确销量!
接下来就可以将表格改成饼图啦:
这其实属于POWER BI常用的一种套路,利用度量值巧妙实现一些比较个性化的需求。
接下来我们再来拓展一下,能不能实现动态显示TOPN品牌并自动将剩余品牌归类呢?
要实现动态TOPN,首先肯定是要先建立一个参数表,点击新建参数:
有了参数,和刚才相同的思路:
问题1:动态图例问题,如何实现TOP N品牌的显示?
可以翻译一下问题:如何只显示N+1个品牌,其中1个是永远排第一的“其他品牌”, 剩下的是销量排名前N的品牌?
这里需要继续借助一个辅助度量值排名了,新建度量值:
这里利用刚刚建立的[TOP4品牌销量标准]这个度量值,还记得吗,这个度量值是为了赋予“其他品牌”最大销量值。
这里用到了一个小技巧,我们要把所有排名在N+1之后的品牌全部赋予一个固定排名数字:0,然后在筛选器里屏蔽这个排名为0的品牌,这样就成功实现了我们的目标。
问题2:如何让其他品牌显示正确的销量?
这个就简单啦,还是利用我们刚刚建立的[销量(含其他品牌)]度量值,只要把刚刚设置的数字3替换成参数N即可。
我们来看一看效果:
至此,还有一个细节问题,现在的图例默认是按照销量大小排序的,如果我想让“其他品牌”永远排序最后一位,该如何实现呢?
很简单,还是利用度量值,我们新建一个度量值叫做[品牌排序参照]:
品牌排序参照 = IF(SELECTEDVALUE('全品牌数据'[品牌]) = "其他品牌", 0, [销量(含其他品牌)])
好啦,目标达成,现在你也可以动手试试,能否帮助你解决一些类似的日常业务场景吧!