(时间:23点15分)微信嘀嘀嘀~
小A:白茶兄!!白茶兄!!在不在??!!救命啊,兄弟!
白茶:(一脸迷茫)啊?!
小A:是这样的,我遇到了一个需求问题!某位老板,想自由切换TOP3!
白茶:额,这个我不是教过你么?TOP3通过ALLSELECTED函数可以实现啊!
小A:不是这样的,这个老板是个完美主义者!要的是不同维度的TOP3,并且只能显示一个,比如选择A维度就不能出现B维度的TOP3,但是要求在一个框框中体现!
白茶:…
小伙伴们,以上就是本期内容的问题来源,一些场景和人物都是白茶虚构的,但是这个事却是真的。
在实际生活中,我们经常能遇到各种莫名其妙的需求,也就是白茶所说的中国式报表——即追求个性化自定义逻辑的报表。
而且因为行业和业务需求的不同,这类问题也是千奇百怪。没有办法做一个系统的归纳,只能是不断的发现需求,解决需求。
话不多说,开始本期的问题:
如何在不同维度之间切换TOP3,并且让无关项不显示呢?
模拟数据:
这是白茶随机模拟的一份销售明细。
其中包含了两个可以分析的维度:品名和分店。
将其导入到BI中,建立基础的度量值。
销售数量 : =
SUM ( '销售明细'[销售数量] )
关于本期的问题,白茶有两个解决思路。
思路①:
通过IF判断字段来决定是否显示相关排名。
编写两个维度的TOP3排名度量值。
商品TOP:
RANKX_商品 =
VAR T1 =
RANKX ( ALLSELECTED ( '销售明细'[商品名称] ), [销售数量 :] )
RETURN
IF ( T1 <= 3, T1, BLANK () )
分店TOP:
RANKX_分店 =
VAR T1 =
RANKX ( ALLSELECTED ( '销售明细'[所在分店]] ), [销售数量 :] )
RETURN
IF ( T1 <= 3, T1, BLANK () )
结果如下:
添加切片器维度:
通过IF对筛选字段进行判断。
商品排名:
RANKX_商品KPI =
IF ( SELECTEDVALUE ( '维度表'[维度] ) <> "分店", [RANKX_商品], BLANK () )
分店排名:
RANKX_分店KPI =
IF ( SELECTEDVALUE ( '维度表'[维度] ) <> "商品", [RANKX_分店], BLANK () )
这里解释一下:
1、通过RANKX函数,分别对[商品]、[分店]维度进行排名,排序依据是[销售数量],利用IF判断,排名小于3显示,否则为空;
2、利用IF进行维度字段判定,符合条件显示,否则为空,通过度量值实现维度消失的效果。
其效果如下:
如果BOSS想让两个在一个框框内,可以选择将两个可视化插件重叠,也可以通过多行卡片图显示。
思路②:
通过坐标维度显示。
编写如下代码,添加表函数:
TABLE =
VAR T1 =
SELECTCOLUMNS ( '销售明细', "明细", [商品名称], "类别", "商品", "INDEX", "1" )
VAR T2 =
SELECTCOLUMNS ( '销售明细', "明细", [所在分店], "类别", "分店", "INDEX", "2" )
RETURN
DISTINCT ( UNION ( T1, T2 ) )
结果如下:
编写度量值,将新生成的坐标维度与事实表建立联系:
KPI =
VAR T1 =
TREATAS ( VALUES ( 'TABLE'[明细] ), '销售明细'[商品名称] )
VAR T2 =
TREATAS ( VALUES ( 'TABLE'[明细] ), '销售明细'[所在分店] )
VAR T3 =
SELECTEDVALUE ( 'TABLE'[类别] )
RETURN
SWITCH (
TRUE (),
T3 = "商品", CALCULATE ( [销售数量 :], T1 ),
T3 = "分店", CALCULATE ( [销售数量 :], T2 )
)
排序依据有了,编写排名代码:
RANKX KPI =
VAR T1 =
RANKX ( ALLSELECTED ( 'TABLE'[明细] ), [KPI] )
RETURN
IF ( T1 <= 3, T1, BLANK () )
其结果如下:
解释一下思路:
1、通过新建的表函数,将两个维度放在一列中;
2、利用TREATAS将维度与事实表联系起来;
3、利用RANKX进行排序,之后IF判断,符合条件显示,否则为空。
我们对比一下效果:
小伙伴们❤GET了么?
白茶会不定期的分享一些函数卡片
(文件在知识星球[PowerBI丨需求圈])
这里是白茶,一个PowerBI的初学者。