Power BI之DAX神功:第4卷第5回 使用虚拟关系实现动态分组
一、先谈需求
我们有如下三张表:

关系图如下:

实现需求:


二、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等等