Power BI之DAX神功番外篇:第1回 Calculate+ALL表 与 Filter+ALL表 是两个概念
各位网友大家好!PowerBI之DAX神功番外篇专门处理《DAX神功》中讲过的,但是仍有网友提问的问题!为了不干扰《DAX神功》正常流程,特开此系列
一、网友需求
友情提示:截图你看不清楚没关系,我会复述网友的提问

我来复述一下网友提问,有如下一张表:

写了两个度量值:
A1 = CALCULATE(sum('表'[数量]),FILTER(ALL('表'),SUM('表'[数量])>2))
A2 = CALCULATE(SUM('表'[数量]),FILTER(all('表'),CALCULATE(sum('表'[数量]))>2 ))
Ps: A2的等价度量值
总数量=SUM('表'[数量])
A2等价= CALCULATE([总数量],FILTER(all('表'),[总数量]>2 ))
在矩阵上的显示结果:

二、声明:这个案例有误区
这个案例网友一定是从一些网站或群里获取到的,案例本身是国外某文章上的原例,是为了给你讲内层、外层、隐形、显形而专门设计的特殊案例,但是这样也必然会给人们带来疑惑!它会给你一个误区,让你觉得A1可以过滤掉A和B,其实这里面的水很深。千万不要死记硬背,要动脑子!避开误区更易理解。
三、用新的表格查看A1和A2的结果
Ps:我增加一行种类为A的数据,让这张表不在是一端表,这样更易理解

还是这两个度量值:
A1 = CALCULATE(sum('表'[数量]),FILTER(ALL('表'),SUM('表'[数量])>2))
A2 = CALCULATE(SUM('表'[数量]),FILTER(all('表'),CALCULATE(sum('表'[数量]))>2 ))

四、注意:all表在filter和calculate中是两个意思
网友们最大的误区就是将Calculate+all(表) 与 filter+all(表) 搞混淆
《DAX神功》第1卷第21回 我们讲到 all有多个功能,其中它可以是calculate的调节器,也可以是表。在calculate中做参数时它是调节器(取消筛选功能),但是在filter中它只是表而已!
证明如下:是否使用all(表) 与 在Filter中筛选这张表无关,因为all(表)还是返回这张表,不影响filter的筛选,他在filter中不是取消筛选的功能,他只是一张表。
证明1:在新建表中 表1=all('表') //返回的还是原表

证明2:是否使用all(表) 筛选的结果是一样的
表 2 = FILTER('表',sum('表'[数量])>2)

表 3 = FILTER(all('表'),sum('表'[数量])>2)

表 4 = FILTER('表',CALCULATE(sum('表'[数量]))>2)

表 5 = FILTER(all('表'),CALCULATE(sum('表'[数量]))>2)

五、如果我们用的是 filter+表 是什么样子?
接下来我们做如下测试:
A1改 = CALCULATE(sum('表'[数量]),FILTER('表',SUM('表'[数量])>2))
A2改 = CALCULATE(SUM('表'[数量]),FILTER('表',CALCULATE(sum('表'[数量]))>2 ))

电视剧《大宅门》白景琦说过:中医治病不是哪疼治哪,有时脑袋疼就要治脚!
要理解 calculate+filter(all表) 必先理解 calculate+filter(表)
六、度量值【A1改】的原理是什么
A1改 = CALCULATE(sum('表'[数量]),FILTER('表',SUM('表'[数量])>2))
迷惑人的地方:新建表中返回了原表,因为filter是行上下文,当你没有聚合条件时,它肯定返回原表。

A1改的工作流程:前提是你用种类做行标题

当我们得到ACDE这张表以后,放到calculate中做筛选条件:
A1改= calculate(计算器, ACDE这张表)
筛选每个种类的数量和大于2的,得到的表是ACDE种类的表。将其放到calculate的筛选器中得到的就是ACDE商品的数量
注意:他并不是将每一行赋值之后再计算ABCDE聚合后的结果,而是直接筛选ABCDE聚合后大于2的结果。
七、“母子关系”:为什么度量值【A1改】的总计是18,而不是16?
“母子关系”是《DAX神功》独创的。

李四(女)怀孕了,但是她的丈夫张三突发意外身亡。王五(男)娶了李四,李四成了王五的合法妻子,但是李四的孩子并不是王五的。所以A1改的总计仍然显示是18,因为filter里面的SUM('表'[数量])=18,最外层的calculate只负责让母亲改嫁,它无法让filter内层的SUM('表'[数量])实现筛选功能。
想让孩子有一个快乐的童年,一家三口幸福的过日子,将这个消息深深的掩埋是一个善意的谎言。所以度量值A2改的filter内的calculate负责将孩子转化成王五的儿子,就好比随了王五的姓。所以A2改的总计是15。
A1改 = CALCULATE(sum('表'[数量]),FILTER('表',SUM('表'[数量])>2))
A2改 = CALCULATE(SUM('表'[数量]),FILTER('表',CALCULATE(sum('表'[数量]))>2 ))
八、度量值【A1】的原理是什么?
A1 = CALCULATE(sum('表'[数量]),FILTER(ALL('表'),SUM('表'[数量])>2))
大家注意下面这段话:
FILTER(ALL('表'),SUM('表'[数量])>2) 与 FILTER('表',SUM('表'[数量])>2) 单纯来看并无区别
但是当你将FILTER(ALL('表'),SUM('表'[数量])>2) 放到Calculate中,all(表)的调节器功能就展现出来了。他变成了 calculate+all(表)的形式
FILTER(ALL('表'),SUM('表'[数量])>2) 得到ACDE商品的表,根据“母子关系”,A1改的总计是18,所以A1每一项都是18,因为all(表)。


九、度量值【A2改】的原理是什么?
A2改 = CALCULATE(SUM('表'[数量]),FILTER('表',CALCULATE(sum('表'[数量]))>2 ))
因为:FILTER('表',CALCULATE(sum('表'[数量]))>2 ) 内部使用了Calculate,他将值赋值到每一行,再筛选出大于2的

所以,现在得到了ACDE这张表,放到Calculate中也会得到ACDE的值,不过它与A1改是有区别的,A1改直接筛选每个种类聚合后大于2的,而A2改分配给每一行后筛选大于2的。
十、度量值【A2】的原理是什么
A2 = CALCULATE(SUM('表'[数量]),FILTER(all('表'),CALCULATE(sum('表'[数量]))>2 ))
FILTER(all('表'),CALCULATE(sum('表'[数量]))>2 ) 与 FILTER('表',CALCULATE(sum('表'[数量]))>2 ) 在单独使用时没有区别,都显示ACDE商品的表
但是放到Calculate中 all(表)的调节器作用生效,由于你在filter中使用了calculate实现了对sum('表'[数量])的筛选功能,根据“母子关系”,A2改的 总计是15,所以每一行显示者是15
且:A2改和A1改的重要区别,A2改是将值分配给每一行(就是整个表)再筛选,A1改直接筛选符合条件的。所以A2就是所有的种类都是15。

《孙兴华讲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等等
https://www.bilibili.com/read/cv10222110

