前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在矩阵的行上显示“其他”【3】切片器动态筛选的猫腻

如何在矩阵的行上显示“其他”【3】切片器动态筛选的猫腻

作者头像
陈学谦
发布2021-11-15 16:25:04
2.5K0
发布2021-11-15 16:25:04
举报
文章被收录于专栏:学谦数据运营学谦数据运营

往期推荐

如何在矩阵的行上显示“其他”【1】

如何在矩阵的行上显示“其他”【2】

正文开始

上一篇文章的末尾,我放了一张动图:

当年度切片器变换筛选时,子类别中显示的种类和顺序是不相同的,但不变的是:

  • ①others永远显示在最后一行
  • ②显示的10个子类别按照sales或sales%从高到低排序

看上去好像不难。

但是我们仔细审视一下这张图,猜测一下它实现的原理。

  • 首先这张图是按照子类别排序的,又能够实现动态排序,必然采用的是“按列排序”。
  • 其次,有年度切片器可以控制这张表,说明新建的表一定存在一个“年度”列。
  • 再次,年度切片器变化时,不同的子类别对应的数据变化,而我们说数据表在建立的那一刻起就是固定的,除非再次刷新,否则切片器不会改变原数据。

那么我们基本上可以得出结论了:数据表是由子类别和年度组合构成,把每年的子类别对应的销售额放进去,通过筛选年度切片器,达到选择不同年份时显示不同的销售额。

我们根据以上的思路试着来建立模型。

1.建立子类别和年度的组合表

使用SUMMARIZE函数将子类别和年度的组合列出来

代码语言:javascript
复制
子类别表2 = SUMMARIZE('data',data[子类别],'日期表'[年度])

2.添加sales计算列

计算每个子类别的年度sales值

代码语言:javascript
复制
sales = 
VAR NIAN=[年度]
RETURN CALCULATE([sales],'日期表'[年度]=NIAN)

3.添加各年每个子类别的sales排名

RANKX是迭代函数,会将行上下文自动转为筛选上下文,因此需要将除了年度以外的列都ALL掉,这样才能保证在每个年度内进行RANKX排序。

代码语言:javascript
复制
sales.oneyear.rankx = 
RANKX(
  CALCULATETABLE('子类别表2',ALLEXCEPT('子类别表2','子类别表2'[年度])),
  '子类别表2'[sales]
  )

4.将每年排序大于10的子类别标记为others

这样选择不同年份时,就会显示不同的子类别,others内包含的信息也就不同了。

代码语言:javascript
复制
子类别表2 = SUMMARIZE('data',data[子类别],'日期表'[年度])

5.将每年的排序值大于10的rankx标记为11

其实这一步,如果想简单一点,可以和第3步合并到一起,用一个变量返回值来实现。

代码语言:javascript
复制
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%没有办法进行操作,必然是不同的。

对于第一条,不同年份的子类别名称一般而言是相同的,但是如果我们强行让它们不相同呢?

代码语言:javascript
复制
子类别3 = [年度]&"-"&[子类别2]

对于不同的年份,每一个子列别上都附带着对应的年份,因此没有任何一个子类别是重复的,每一个子类别都对应着唯一的一个rankx,也就是说,我们解决了无法“按列排序”的问题。

我们来看一下效果:

这样基本达到了本文开始的要求:

当年度切片器变换筛选时,子类别中显示的种类和顺序是不相同的,但不变的是:

  • ①others永远显示在最后一行
  • ②显示的10个子类别按照sales或sales%从高到低排序

所以,剩下的问题就是如何在不显示子类别前面的年份的前提下,让不同年份对应的子类别不同,如下图所示:

关注【学谦数据运营】,下篇回答这个问题。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-11-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PowerBI生命管理大师学谦 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档