如何在矩阵的行上显示“其他”【3】切片器动态筛选的猫腻
往期推荐
正文开始
上一篇文章的末尾,我放了一张动图:
当年度切片器变换筛选时,子类别中显示的种类和顺序是不相同的,但不变的是:
- ①others永远显示在最后一行
- ②显示的10个子类别按照sales或sales%从高到低排序
看上去好像不难。
但是我们仔细审视一下这张图,猜测一下它实现的原理。
- 首先这张图是按照子类别排序的,又能够实现动态排序,必然采用的是“按列排序”。
- 其次,有年度切片器可以控制这张表,说明新建的表一定存在一个“年度”列。
- 再次,年度切片器变化时,不同的子类别对应的数据变化,而我们说数据表在建立的那一刻起就是固定的,除非再次刷新,否则切片器不会改变原数据。
那么我们基本上可以得出结论了:数据表是由子类别和年度组合构成,把每年的子类别对应的销售额放进去,通过筛选年度切片器,达到选择不同年份时显示不同的销售额。
我们根据以上的思路试着来建立模型。
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不能有多个值。
如果说这个问题有解决办法,那么突破口一定是在这个位置。
好了,我们来想一下,不同年份的子类别名称自然是相同的,不同年份的排序数字一般也是不同的,除非不同年份排序数字也相同,但是这不现实。
- 1.不同年份的子类别名称自然是相同的
- 2.不同年份的排序数字一般也是不同的
对于第二条,100%没有办法进行操作,必然是不同的。
对于第一条,不同年份的子类别名称一般而言是相同的,但是如果我们强行让它们不相同呢?
子类别3 = [年度]&"-"&[子类别2]
对于不同的年份,每一个子列别上都附带着对应的年份,因此没有任何一个子类别是重复的,每一个子类别都对应着唯一的一个rankx,也就是说,我们解决了无法“按列排序”的问题。
我们来看一下效果:
这样基本达到了本文开始的要求:
当年度切片器变换筛选时,子类别中显示的种类和顺序是不相同的,但不变的是:
- ①others永远显示在最后一行
- ②显示的10个子类别按照sales或sales%从高到低排序
所以,剩下的问题就是如何在不显示子类别前面的年份的前提下,让不同年份对应的子类别不同,如下图所示:
关注【学谦数据运营】,下篇回答这个问题。
相关文章
- React Hooks 在 SSR 模式下常见问题及解决方案
- 来自Kubernetes和CI/CD的优秀实践
- PHP程序员的技术成长规划
- PHP内核分析:Zend虚拟机
- 适合教孩子编码的七款免费编程语言
- 未来10年会过时的5门编程语言,别再学它们了!
- 量子神经网络能给人类永生吗?爱因斯坦的「幽灵超距作用」或可实现「意识永存」
- 送给前端 er 一份 HTTP 基础知识大图
- KDE 或将更多使用动态窗口装饰
- Fedora 35 或取消“允许用密码登录 SSH Root”的安装程序选项
- C#开发人员应该知道的13件事情
- Rust也出2077?受欢迎的编程语言再度更新!
- Python vs PHP vs Ruby —— 编程语言大对决
- 什么样的程序员生涯指南,能在GitHub上获3.6万星
- 在IDE中刷LeetCode,编码调试一体化,刷题效率直线up
- 听我讲完GET、POST原理,面试官给我倒了杯卡布奇诺
- SimpleDateFormat线程不安全的5种解决方案!
- 面试侃集合 | ArrayBlockingQueue篇
- 软件开发中最顶级的 17 个平台和工具
- 深入探讨 CSS 特性检测