往期推荐
正文开始
上一篇文章的末尾,我放了一张动图:
当年度切片器变换筛选时,子类别中显示的种类和顺序是不相同的,但不变的是:
看上去好像不难。
但是我们仔细审视一下这张图,猜测一下它实现的原理。
那么我们基本上可以得出结论了:数据表是由子类别和年度组合构成,把每年的子类别对应的销售额放进去,通过筛选年度切片器,达到选择不同年份时显示不同的销售额。
我们根据以上的思路试着来建立模型。
1.建立子类别和年度的组合表
使用SUMMARIZE函数将子类别和年度的组合列出来
子类别表2 = SUMMARIZE('data',data[子类别],'日期表'[年度])
2.添加sales计算列
计算每个子类别的年度sales值
sales =
VAR NIAN=[年度]
RETURN CALCULATE([sales],'日期表'[年度]=NIAN)
3.添加各年每个子类别的sales排名
RANKX是迭代函数,会将行上下文自动转为筛选上下文,因此需要将除了年度以外的列都ALL掉,这样才能保证在每个年度内进行RANKX排序。
sales.oneyear.rankx =
RANKX(
CALCULATETABLE('子类别表2',ALLEXCEPT('子类别表2','子类别表2'[年度])),
'子类别表2'[sales]
)
4.将每年排序大于10的子类别标记为others
这样选择不同年份时,就会显示不同的子类别,others内包含的信息也就不同了。
子类别表2 = SUMMARIZE('data',data[子类别],'日期表'[年度])
5.将每年的排序值大于10的rankx标记为11
其实这一步,如果想简单一点,可以和第3步合并到一起,用一个变量返回值来实现。
sales.oneyear.rankx2 =
IF([sales.oneyear.rankx]<=10,[sales.oneyear.rankx],11)
6.呈图演示
这样我们就可以实现通过筛选不同的年份,来达到子类别显示的顺序不同,子类别显示内容也不同了:
不过,正如上文我们说的,这种按照销售额或者销售占比排序的问题在于:others并不是处于最后一行。
而要实现按照子类别排序时,本质是按照rankx来排序,自然是要用到“按列排序”。
选中子类别2,点击“按列排序”,选择按照sales.oneyear.rankx2排序,但是我们发现:
原因说的很清楚。比如说,对于桌子而言,对应的排序有些年份是9,有些年份排名考前,是7:
这样的话,按列排序时,根本不知道桌子到底是9还是7,也就没法排序。你也可能会说,当切片器选择某一具体年的时候,桌子是9还是7这个问题是固定的,比如,切片器选择了2019,桌子的排序就固定是7。
但是,按列排序并不考虑切片器的特殊性,它考虑的是全局性,因为一旦切片器进行了多选或者不选,那么就会出现桌子不知道是9还是7的情况,所以干脆就不让你设置了。
同样,按照其他的列进行排序,也是会得到同样的结果:
事情好像无法往下进行了。
但是铁人王进喜有句名言:“有条件要上,没有条件,创造条件也要上。”
我们再重新审视一下这个按列排序的错误。对于子类别中的同一个值,sales.oneyear.rankx2不能有多个值。
如果说这个问题有解决办法,那么突破口一定是在这个位置。
好了,我们来想一下,不同年份的子类别名称自然是相同的,不同年份的排序数字一般也是不同的,除非不同年份排序数字也相同,但是这不现实。
对于第二条,100%没有办法进行操作,必然是不同的。
对于第一条,不同年份的子类别名称一般而言是相同的,但是如果我们强行让它们不相同呢?
子类别3 = [年度]&"-"&[子类别2]
对于不同的年份,每一个子列别上都附带着对应的年份,因此没有任何一个子类别是重复的,每一个子类别都对应着唯一的一个rankx,也就是说,我们解决了无法“按列排序”的问题。
我们来看一下效果:
这样基本达到了本文开始的要求:
当年度切片器变换筛选时,子类别中显示的种类和顺序是不相同的,但不变的是:
所以,剩下的问题就是如何在不显示子类别前面的年份的前提下,让不同年份对应的子类别不同,如下图所示:
关注【学谦数据运营】,下篇回答这个问题。
本文分享自 PowerBI生命管理大师学谦 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!