Power BI之DAX神功:第4卷第19回 利用TOPN函数将前N名分成一组及图表动态显示
一、课件准备
将下面的VBA代码复制到Excel VBE编译器的模块中运行
得到下面的两张表:


二、利用TOPN将前N名分成一组
我想得到下表这张表的结果:

【1】我要先取到销量前3名的表

通过下面的代码我们就可以获取到上图红框内的数据
【2】我们要给销售前3名的数据排名

通过下面代码我们就可以获得上图红框之内的数据
【3】计算其它
其实就相当于在整张表中,去掉前3名的表,就是其它的表

就是我们在数据库中讲的左外挖空:A相当于全部的表,B相当于前3名的表

而在我们上面的代码中,tb1就是A表,tb2就是B表
详见《DAX神功》第3卷第8回 EXCEPT函数
通过上面的代码,我们就可以获得到下图绿框之内的数据:

因为其它我们只需要一个总和销售:8+10+12=30
这个时候我们可以制作一张表:如下图

详见《DAX神功》第1卷第3回 表构造函数
因为你前面提到了前3名和其它,那其它必然是4,因为UNION连接表时要求,两张表的列数要相等,所以这里表构造函数要与前3名的表排名后的列数一致。
【4】最后将两张表合并
因为这两张表不会出现重复行,所以不必考虑去重问题,但是在其它情况下使用UNION时要考虑重复行问题。
返回结果:

三、最简单的静态图表
我们想一下,第一次在Excel中做图,我们是怎么做的?我们是不是准备好下面这张表,然后去做图?

那刚才我们做好了这张表,直接做图不就好了吗?


四、动态图表显示
【1】新建一张表,包含所有商品名称和其它
因为商品表中没有其它,所以我们要重构一张新的商品表,但是我们不能让新的商品表与商品表连线,这样会出现循环依赖。所以我们取商品编码和商品名称,让新的商品表与销售表连线。

【2】新表与其它表不要建立关系
我们学习了数据沿袭,这里关系越少越好,多一条关系你就多一种考虑。比如你突然来到一个新单位,你看到张三什么都不干,就在那玩,然后你跟到老板办公室说:老板张三什么都不干,就在那玩。老板说:出去!
你知道张三与老板什么关系?所以说下面的线越多,你要考虑的问题就越多。

【3】开始测试
//将下面的度量值【测试】放到矩阵上, 如果新表[商品名称]在矩阵上只有一个值,就显示孙兴华,否则显示颖宝。

返回结果:我们平时经常处理让总计为空,今天让总计变成"颖宝"。

【4】先解决总计问题
无论第1名和其它,还是第N名和其它,那总计永远是总值,不会因筛选而发生发变。所以度量值如下:
现在修改度量值【测试】
第一个问题解决了:

【5】处理商品名称-其它
当商品名称="其它"时,我们返回"热巴",否则返回"孙兴华"

热巴=[销量合计]-[前3名销量] // 78-48=30
返回结果:

【6】最后处理前3名的问题
我们暂时将这个度量值命名为:孙兴华
原理:新表的商品名称列在商品表商品名称列做标记,更改了数据沿袭。筛选这张表中RANKX排名小于等于3的(就是前3名)
修改度量值【测试】
返回结果:

也可以将它改成图表:

【7】将N写成动态
首先我们要将测试所用到的度量值都写到一起
上面的公式中出现了两次3,我们将3写成参数就好了
我们将参数表中的Value字段放到切片器上即可

Ps: 给参数表改表头详见《DAX神功》第1卷第3回,也可以使用建模中的新建参数按钮,我个人不喜欢用。

【8】解决小问题

当我们没有选择切片器参数时,只显示其它,我们想在没有筛选时显示ABCDEF不显示其它
原理:当参数[Value]被筛选时,显示什么,否则显示什么?我们使用变量K来代替否则返回的值。搞定!

《孙兴华讲PowerBI火力全开》PowerBI必学课程
https://www.bilibili.com/video/BV1qa4y1H7wp
《DAX神功》文字版合集:
https://www.bilibili.com/read/readlist/rl442274
《DAX神功》视频版合集:
https://www.bilibili.com/video/BV1YE411E7p3
《DAX神功番外篇》文字版合集:
https://www.bilibili.com/read/readlist/rl478271
PowerBI(DAX函数)、PowerQuery(M函数)、Python办公自动化、Python爬虫、Python数据分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等