欢迎光临散文网 会员登陆 & 注册

Power BI之DAX神功:第4卷第5回 使用虚拟关系实现动态分组

2021-12-20 13:50 作者:孙兴华zz  | 我要投稿

一、先谈需求

我们有如下三张表:

关系图如下:

实现需求:

学生表
矩阵的结果

二、1+1就能解决的问题

如果在学生表中新建列,再计算人数:

返回结果:

新建度量值:

将成绩表中的:新建列放到行标题上,年份放到列标题上!搞定

三、化简为繁:证明1+1=2

上面的方法使用了新建列,对新人非常友好。但是会有人提出以下问题

问题:使用了新建列,消耗性能,降低速度。

答:降低速度和你想方法的时间哪个更多呢?权利在于你,你自已选择。

我们想实现上面的结果,这句话最关键:就是你在分析之前,你要先知道你要什么?你用DAX只是计算,DAX不会给你做分析提供逻辑。

【1】先解决矩阵中列的问题

成绩表[年份] 不重复值组成的表,每一行或每一列(取决于你将年份放在行还是列)都返回1

现在列的问题我已经确定好了,剩下的就是确定行,就将上面的公式改成

测试度量值1 = sumx(VALUES('成绩表'[年份]),行的公式)

【2】再解决矩阵中行的问题

现在问题来了,行的公式,你行标题上放的什么,是不是评价表【评价】字段?但是这张表只有评价字段就能分组吗?不行吧?因为最低分和最高分都要参与进来才能确定你是及格、不及格或优秀。

于是我可以将行的公式写成下面的度量值:

现在我将评价表的评价列放到行标题上:

返回结果是我们需要的吧?

我们将这两个度量值合并到一起:

返回结果,现在你发现了,只要把2改了就搞定了:


【3】确定这个二

当你做分析时,你要先知道怎么分析,否则你就分析不出来。

如果这件事让我用Excel手工做,我肯定在成绩表中筛选0~59不及格人员名称,60~84及格人员名单,85分含以上的优秀人员名单。

我们先准备一个总分的度量值:

然后我们模拟刚才筛选表的过程:

filter(VALUES('成绩表'[学号]),[总分] >= '评价表'[最低分] && [总分] < '评价表'[最高分])

在筛选过程外面套上CountRows就可以计算有多少人了。

当然上面公式你不能在新建表中测试,因为filter第1参数是VALUES('成绩表'[学号]),你找不到评价表,但是你可以将他替换:测试度量值1 = sumx(VALUES('成绩表'[年份]),sumx('评价表',2) ) 中的2

将公式写成:

返回结果:

加上切片器也是OK的:

我与《权威指南》上面用的方法绝对不一样,不要照搬别人的方法,你要用自己的逻辑去写,出错了没关系,改Bug就是你成长的过程。不过这样做也有优点,这样可以达到动态。但是我觉得你改评价表和改Switch公式是一回事:)我不知道你怎么想。

大家都上过学,以数学为例,最后一道提高题,一定是给那些考高分人讲的,对于成绩平时不及格的同学,老师的责任是让他及格或是能考70就不考60,如果一视同仁,都讲提高题,也许这个班有5个学生得100分的,还有半个班的人不及格,这样的老师不是误人子弟吗?说什么原理和公式不分家?讲这话太坑人了,这样讲话完全是将所有人都视同于高手,然后就不停的砸专业术语,所谓的原理,哪有推理过程和证明过程?最多就是画个图,告诉你这个筛选器能覆盖另一个筛选器。如果只听专业术语,那我们买本权威的书籍就好了:)

《孙兴华讲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等等

https://www.bilibili.com/read/cv10222110

Power BI之DAX神功:第4卷第5回 使用虚拟关系实现动态分组的评论 (共 条)

分享到微博请遵守国家法律