编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

工作技巧 | 满足你对TOP N的多种需求

wxchong 2024-10-31 15:28:03 开源技术 36 ℃ 0 评论


在一个风和日丽的早上我蹦蹦跳跳的来到公司上班


打开电脑,发现客户发来一条消息:

“昨天的报表我需要添加一个功能!要按照销售额显示出前三名的店铺!”


好的没问题!


先看数据源:




Q1:如何显示销售额前三名的店铺?

1秒钟时间思考。

...

时间到。




很简单,使用筛选器就可以实现。

结果如下:



将修改发给客户,掏出包里的早餐。还没咬下第一口,客户又发来一条消息:

“我想自己选择显示的条数,快实现一下!”





我放下手里的茶叶蛋……


Q2:如何显示销售额前N名的店铺?

思路:

显示前N名,那么就需要对店铺根据销售额进行排名,选择展示前N名的店铺。DAX中排名的函数我们选择RANKX()




返回表的参数列中每行数字在列表中的排名。

<table>为表名,<expression>可以是任何返回单个标量值的DAX表达式。

后面三个参数为可选参数,分别对应“想查找其排名的单个目标值”、排序方式和遇到重复值时的排序规则。

首先建立参数表_N,这里我们提供3,5,10,50四个可选值(此处可根据业务情况进行更改)。



将参数表N生成切片器,实现点选功能。



利用IF嵌套RANKX,建立度量值如下:

显示前N名租户 =
IF ( RANKX ( ALL (Data[店铺] ), [_销售额],, ) <= MAX ('参数表_N'[N] ), [_销售额], -1 )

其中MAX()函数的作用是当没有选择切片器时,默认返回参数表中的最大值

将度量值【显示前N名租户】添加到值字段,显示结果如下:



将修改后的文件发给客户,拿起已经没有热气的茶叶蛋。

微信又闪烁起来!

“不能倒序吗?我想看倒数的怎么办?”




Q3:如何显示销售额TOP N或者BOT N的店铺?

TOP N 或者BOT N的控制,也就是改变RANKX中的排序方式,之后再选择前N名。这里会用到RANKX的Order参数项。

同样,首先建立参数表_Sort,来选择前N还是后N:





选择Bottom N,也就是升序ASC排名,选择前N;

选择Top N,也就是降序DESC排名,选择前N。

建立度量值:

显示前N + 排序 =
IF (
 SELECTEDVALUE ( '参数表_Sort'[Sort] ) = "Bottom N",
 IF (
 RANKX ( ALL ( Data[店铺] ), [_销售额],, ASC, SKIP ) <=MAX ( '参数表_N'[N] ),
 [_销售额],
 0
 ),
 IF (
 RANKX ( ALL ( Data[店铺] ), [_销售额],, DESC, SKIP )<= MAX ( '参数表_N'[N] ),
 [_销售额],
 0
 )
)

通过 SELECTEDVALUE连接参数表_Sort,使Sort切片器可以控制度量值。然后通过IF的嵌套实现选择不同排序方式时,RANKX的排序方式的变化。

在这里RANKX的第五参数选择skip,也就是遇见相等值采用跳跃排名。

结果如下:







需要注意的是,这里因为IF函数中FALSE的返回值是0,所以筛选器这里要把0排除掉。

再次将文件发给客户,我看着已然没有了灵魂的茶叶蛋,再看看时针已经指到了11点。算了,该吃午饭了。

滴滴滴……

“可以按照指标排序吗?比如,按照销售额?按照租金?按照销售额和租金?”


好的我试试【微笑】。




Q4:如何通过维度表控制按照某个或多个指标筛选TOP N还是BOT N??

通过数据表可知,每家店铺有四个指标:




那么如何实现通过选择不同的KPI指标,来筛选Top N还是 Bottom N呢?

首先,先建立KPI的维度表并生成切片器:




在这里会发现,之前采用的直接显示度量值的方法已经不适用了,因为这里我们要显示四个维度KPI的值。

首先,拉出一个矩阵:




我们只需要控制店铺名称就可以达到目的。

思路如下:N 和排序的控制和之前一样,关键在于如何实现某个或多个KPI共同控制筛选。

如果一家店铺满足多个KPI都是前N的条件,那么一定是“且”的逻辑关系成立。

若单个KPI筛选成立的情况下,返回1,不成立返回0,多个条件的返回值进行“乘法”操作,那么就可以实现“且”的逻辑关系。

最后通过将判定度量值添加到视觉筛选器,筛选返回值为1的店铺名称,即为满足需求。

最终度量值如下,IF多层嵌套比较长但是并不复杂,其中KPI的选择用到了 IN 函数。

综合排名 =
IF (
 SELECTEDVALUE ( '参数表_Sort'[Sort] ) = "Bottom N",
 IF (
 "销售额" IN VALUES ( '参数表_KPI'[KPI] ),
 IF ( RANKX ( ALL ( Data[店铺] ), [_销售额],, ASC ) <= MAX ('参数表_N'[N] ), 1, 0 ),
 1
 )
 * IF (
 "销售坪效" IN VALUES ( '参数表_KPI'[KPI] ),
 IF ( RANKX ( ALL ( Data[店铺] ), [_销售坪效],, ASC ) <= MAX ('参数表_N'[N] ), 1, 0 ),
 1
 )
 * IF (
 "租金" IN VALUES ( '参数表_KPI'[KPI] ),
 IF ( RANKX ( ALL ( Data[店铺] ), [_租金],, ASC ) <= MAX ('参数表_N'[N] ), 1, 0 ),
 1
 )
 * IF (
 "租金坪效" IN VALUES ( '参数表_KPI'[KPI] ),
 IF ( RANKX ( ALL ( Data[店铺] ), [_租金坪效],, ASC ) <= MAX ('参数表_N'[N] ), 1, 0 ),
 1
 ),
 IF (
 "销售额" IN VALUES ( '参数表_KPI'[KPI] ),
 IF ( RANKX ( ALL ( Data[店铺] ), [_销售额],, DESC ) <= MAX( '参数表_N'[N] ), 1, 0 ),
 1
 )
 * IF (
 "销售坪效" IN VALUES ( '参数表_KPI'[KPI] ),
 IF ( RANKX ( ALL ( Data[店铺] ), [_销售坪效],, DESC ) <= MAX( '参数表_N'[N] ), 1, 0 ),
 1
 )
 * IF (
 "租金" IN VALUES ( '参数表_KPI'[KPI] ),
 IF ( RANKX ( ALL ( Data[店铺] ), [_租金],, DESC ) <= MAX( '参数表_N'[N] ), 1, 0 ),
 1
 )
 * IF (
 "租金坪效" IN VALUES ( '参数表_KPI'[KPI] ),
 IF ( RANKX ( ALL ( Data[店铺] ), [_租金坪效],, DESC ) <= MAX( '参数表_N'[N] ), 1, 0 ),
 1
 )
)


筛选器设置如下:





最终展示结果如下:




按住CTRL可以选择多个指标排序。

保存文件,发送客户。门外响起了外卖小哥的敲门声。午饭到咯~

总结

以实际业务需求为切入点,层层深入,将维度做成切片器,并实现复杂的筛选控制。

利用本文中的技巧,可以极大的减少重复性报表的空间占用,通过维度切片器筛选指标,做到最大限度的融合利用。

满足你对TOP N的无数种需求~!

需要源文件的小伙伴可以在后台私信或在评论区留下自己的邮箱~

本期内容就是这些,我们下期再见!

* PowerPivot工坊原创文章,转载请注明出处!


延伸阅读:

Power BI:环形KPI可视化

实现TOPN and others排名分类

实现TOPN and others排名分类(续)

计算排名二三事

关于Power BI 中 排名问题的总结



如果您想深入学习微软Power BI,欢迎登录网易云课堂试听学习我们的“从Excel到Power BI数据分析可视化”系列课程。或者关注我们的公众号(PowerPivot工坊)后猛戳”在线学习”。





长按下方二维码关注“Power Pivot工坊”获取更多微软Power BI、PowerPivot相关文章、资讯,欢迎小伙伴儿们转发分享~



Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表