Power BI之DAX神功:第3卷第14回 在度量值中使用Calculate调节器小心扩展表
《The Definitive Guide to DAX》中本节课名称为:在度量值中使用表筛选器
然而,它用的全部是调节器!筛选器和调节器的区别与顺序,我们在《DAX神功》第1卷第21回中做了详细解释。
一、ALL表与扩展表有关
众所周知,当all系列函数在Calculate中使用时,他不是筛选器而是调节器。我们以all函数为例,看看在扩展表原理中应该注意什么?


那为什么下面度量值中,all学生表与all成绩表结果相同呢?
姓名列来自学生表,但是all成绩表中我写着是:all(成绩表)
为什么还是删除了学生表的筛选?

答:因为扩展表原理:
由于学生表与成绩表是一对多关系,成绩表是多端,它的扩展表包含学生表中所有列。

二、如何恢复指定表的筛选
《DAX神功》第3卷第12回 我们讲到下面这个模型,因为扩展表原理的存在,如果筛选表2中的科目,会连带表2和表3,但是如果只筛选表4中的老师,则不会连带表3中的老师。

现在如果我ALL(表2),会删除表1、表2、表3、表4所有列的筛选
如果我ALL(表4),则只会删除表4中所有列的筛选
这个时候就牵扯一个问题,假设我使用all(表2)时,我只想删除表2中的所有列的筛选,不想牵连其它表。
《DAX神功》第1卷第17回 我们讲到 恢复列筛选时,我说你记Keepfilters就可以了,没有必要使用Values,当时我们举了例子:
销量1删除了'销售表'[日期]列的筛选,
销量2我们使用Keepfilters恢复了'销售表'[日期]列的筛选
销量3我们删除了'销售表'[日期]列的筛选,又使用Values生成了'销售表'[日期]列的筛选
Values与keepfilters二选一就可以了
上面都是对列的应用,如果对表的应用呢?
calculate([总分数],all(表2)) // 相当于取消了表1、表2、表3、表4所有列的筛选
如果我想恢复表3和表4所有列的筛选:
calculate([总分数],all(表2),values(表3),values(表4))
或
calculate([总分数],all(表2),keepfilters(表3),keepfilters(表4))
现在回到我们这节课一开始的案例中:


// 现在的度量值【all成绩表】只删除了成绩表所有列的筛选。

三、使用ALLEXCEPT函数恢复指定表筛选
也可以通过《DAX神功》第1卷第17回 我们讲的Allexcept函数实现,如果是列我推荐你使用,现在是表,我不推荐你使用。
比如:在一对多关系中,成绩表是多端表,它有扩展表,包含学生表的所有列,因为我们的案例只有2个表,如果有4张表,假设成绩表的扩展表包括其它3张表的所有列时,如果我只想删除成绩表的筛选,保留其它3张表的筛选。ALLEXCEPT('成绩表','学生表','xx表','xx表')
我们还是使用下面这个图来举例:
ALLEXCEPT(表2,表1,表3,表4) // 删除表2所有列筛选,保留其它表所有列筛选
ALLEXCEPT 第1参数是可以扩展的那个表,后面的参数都是关联表

但是,我并不推荐这样的方法,如果你表之间随在虚线关系,且牵扯临时激活,那情况又复杂了。老老实实的使用Keepfilters吧。
在《The Definitive Guide to DAX》中,还介绍了ALLSELECTED函数,我会在《DAX神功》第3卷末精讲ALLSELECTED函数时,将之前涉及到ALLSELECTED函数的案例统一讲解。
在本课结束前,如果手中有《The Definitive Guide to DAX》这本书的小伙伴,建议你认真读一读书中本课最后一段。书中大意:表关系要按规矩来,别随心所欲,表能少就少,该合并到一起的就合并到一起。

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