美文网首页Power BI干货PowerBI专栏
Power BI从零开始动态实现TOPN及其他

Power BI从零开始动态实现TOPN及其他

作者: PowerBI星球 | 来源:发表于2020-11-26 22:25 被阅读0次

       文/大脸猫    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, [销量(含其他品牌)])

    然后将这个度量值拖到工具提示,选择排序方式按照[品牌排序参照]排序。

    最终效果如下:

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

    -精彩推荐-

    Power BI商业数据分析模型:RFM客户价值分析

    如何用PowerBI 打造高大上的财务报表分析报告?

    Power BI应用技巧:动态显示最近N天的数据

    PowerBI数据分析和可视化实战案例

    采悟 from Power BI 星球

    相关文章

      网友评论

        本文标题:Power BI从零开始动态实现TOPN及其他

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