Power BI之DAX神功:第3卷第21回 ALL系列函数总结
今天我们对ALL系列函数做总结,方便大家学习完前面的课程后到这里查询:
一、ALL函数
【1】表函数:返回一张表

返回:姓名列不重复值构成的表

关于ALL(表),《权威指南》出现勘误,我看了同事中文版第444页(还有其它函数的描述也出现了问题),ALL系列函数总结表,它说ALL当做表函数时,返回列或表的所有不重复值。显然不是这样的,证明如下:
返回:原始表,只是进行了排序。ALL(表)是取这张表的所有行

【2】调节器:从指定列或扩展表中删除筛选器

当学生表与成绩表,通过学号建立一对多关系时:
Calculate(Sum('成绩表'[分数]),ALL('学生表'[姓名])) // 删除学生表姓名列筛选
Calculate(Sum('成绩表'[分数]),ALL('学生表')) // 删除学生表所有列筛选,因为学生表是1端,扩展列是它本身
Calculate(Sum('成绩表'[分数]),ALL('成绩表')) // 删除学生表和成绩表所有列筛选,因为扩展表原理,成绩表的扩展表包含学生表所有列
Calculate(Sum('成绩表'[分数]),ALL()) // 删除整个模型所有列的筛选
以上证明详见《DAX神功》第3卷第20回
Ps:《火力全开》笔记28.01 还介绍了REMOVEFILTERS函数,它只能做引擎的调节器,功能是ALL函数的缩水版。(了解一下能看懂别人的代码即可)
二、ALLEXCEPT函数
【1】表函数:返回一张表

返回:除了指定列以外,由其它列不重复值构成的表

新建表3的等价公式:如果有多个列,使用ALLEXCEPT会精简代码量
【2】调节器:除指定列以外,删除其它列筛选,包含扩展表。

当学生表与成绩表,通过学号建立一对多关系时:
总分 = Sum('成绩表'[分数])
Calculate([总分],ALLEXCEPT('学生表','学生表'[姓名])) // 只有学生表姓名列保留筛选
Calculate([总分],ALLEXCEPT('成绩表','成绩表'[学号])) // 只有成绩表学号列保留筛选,当ALLEXCEPT第1参数为多端表时,就要考虑扩展表上面的列,本例也同时会删除学生表所有列的筛选。
【3】调节器的特殊用法
详见《DAX神功》第3卷第14回 提到可以使用ALLEXCEPT函数恢复指定表筛选

ALLEXCEPT(表2,表1,表3,表4) // 删除表2所有列筛选,保留其它表所有列筛选
ALLEXCEPT 第1参数是可以扩展的那个表,后面的参数都是关联表
【4】注意保留筛选与删除后添加筛选的区别
《DAX神功》答网友问15 Allexcept和ALL/VALUES的区别 删除与添加筛选器
三、ALLNOBLANKROW函数
【1】表函数:不考虑无效关系造成的空行

学生表与成绩表通过学号连线,由于一端表主键元素少于多端表外键元素,这是明显不符合实时参照完整性行为,孙兴华讲Access基础篇应该是所有数据分析初学者必修课。
详见《DAX神功》第1卷第9回
【度量值】ALL行数 = COUNTROWS(ALL('学生表'[姓名]))
【度量值】ALL行数 = COUNTROWS(ALL('学生表'))
// 返回:3 因为ALL函数检查无效关系添加的空行。
【度量值】ALLNOBLANKROW行数 = countrows(ALLNOBLANKROW('学生表'[姓名]))
【度量值】ALLNOBLANKROW行数 = countrows(ALLNOBLANKROW('学生表'))
// 返回:2 因为ALLNOBLANKROW函数不检查无效关系添加的空行。
总结:做表函数时ALLNOBLANKROW与ALL就这样一个区别。这里指的是因违反实时参照完整性造成无效关系添加的空行,并不是表本身存在的空行。
【2】调节器:会添加一个只删除无效关系产生空白行的筛选器替换原筛选器
详见《火力全开》笔记08
实际使用意义不大,学生表中没有的人,是不会有考试成绩的。商品表里没有的商品是不会产生销售的。除非...你在讲特例。
返回结果:

但是,当我们使用一端表字段筛选时会显示下面的情况:因为筛选器被替换所致

处理方法:
返回结果:问题解决了!

当然这样的问题,在实际分析中是遇不到的,遇到了就不是你的数据问题,而是你所在的单位出问题了!你想想:一个不是你们学校的学生,在你们学校参加考试拿到了毕业证,这件事能上热搜。
四、ALLSELECTED函数
【1】表函数:返回表或列上面最后一个影子上下文中的表或列的不重复值。
原理详见《DAX神功》第3卷第18回 复杂公式强烈建议避开
【2】调节器:删除其它筛选器,激活影子筛选器。
原理详见《DAX神功》第3卷第18回 复杂公式强烈建议避开
【3】调节器最基础的功能(广泛应用):计算视觉
友情提示:ALLSELECTED函数有太多坑,建议只应用最基础的功能。

以上两张表,通过学号字段建立一对多关系。度量值如下:
返回结果如下:

【4】无参数的ALLSELECTED函数
详见《DAX神功》第3卷第20回 在这一集中我写了替代方案,在实际应用中,我基本用不到它。
五、ALLCROSSFILTERED函数
这个函数的官方解释,权威指南上说的很好,微软帮助文档太过简单。但是这个函数可以被ALL函数代替,迄今为止我还没有想出特例中的案例,也有人讲过这个函数,最终结果是ALL函数可以代替,并且留下一句话:最好把ALLCROSSFILTERED函数也掌握了,万一用上了呢。其实,可能会有另一个版本,也可能哪一天,万一就取消了这个函数,也说不定哦:)

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