从数据到信息
从信息到洞察

CALCULATE 指南

本文是 CALCULATE 系列的最后一篇,是时候提供关于这个函数全面总结了。之后你在浏览其他文章的时候,很可能会多次回来参考本文的内容,不必担心,这是正常的。每当需要回忆 CALCULATE 的复杂行为时,你都可以在这里找到答案。

不要因为反复查看本文内容而怀疑自己的学习能力,即使一些使用 DAX 多年的开发者,仍然必须提醒自己注意公式的计算规则。DAX 是纯净且强大的语言,但一些容易被遗忘的细节往往能解决特定场景下的关键问题。

CALCULATE 总结

初始环境

CALCULATE计值上下文中执行,该上下文包含一个筛选上下文,可能包含一个或多个行上下文,这是公式计值的初始环境。

创建新的筛选上下文

CALCULATE 创建一个新的筛选上下文,在其中计值第一个参数。新的筛选上下文只包含筛选上下文,由于上下文转换的作用,所有行上下文在筛选上下文中都消失了。

接受三种参数

CALCULATE 表达式接受三种类型的参数:

第一参数必选,将在新筛选上下文中计值的表达式。

显式筛选器参数:用来操作原始筛选上下文,每个筛选器参数都可能使用调节器(Modifier),比如 KEEPFILTERS

CALCULATE 调节器:通过删除一些筛选器或更改关系结构,可以修改模型、调整初始筛选上下文的范围。

执行上下文转换

当原始上下文包含一个或多个行上下文时,CALCULATE 执行上下文转换,向上下文堆栈中添加不可见的隐式筛选器。默认情况下这些隐式筛选器会覆盖外部上下文提供的筛选器,而如果提供行上下文的是使用 KEEPFILTERS 的表表达式,这种情况下隐式筛选器的行为也会被 KEEPFILTERS 修改。

CALCULATE 计值流

CALCULATE 遵循一个非常精确的算法来使用所有的参数。当你需要理解某些复杂计算的时候,必须很好地理解这种算法。

综述:CALCULATE 在初始计值上下文环境中的计算所有显式筛选器参数。初始上下文是公式外部环境,包括原始行上下文(如果有的话)和原始筛选上下文。所有显式筛选器参数在这个初始环境中独立计算,计算完成后,CALCULATE 开始构建新的筛选上下文。

  1. CALCULATE 复制原始筛选上下文,以准备新的筛选上下文
    这个过程中会丢弃原始行上下文,因为新的计值上下文将不包含任何行上下文。
  2. CALCULATE 执行上下文转换
    CALCULATE 使用列在原始行上下文中的当前值,为正在迭代的所有列提供一个具有唯一值的筛选器。值得注意的是此筛选器可能包含也可能不包含单个行,因为上下文转换并不保证新的筛选上下文只包含一行。如果没有活动的行上下文,则跳过此步骤。一旦上下文转换创建的所有隐式筛选器都应用于新的筛选上下文,计算就进入步骤 3。
  3. 计算调节器函数 USERELATIONSHIP、CROSSFILTER 和 ALL 类函数
    这个步骤发生在步骤 2 之后。这非常重要,意味着我们可以通过使用 ALL 来消除上下文转换的影响。CALCULATE 调节器在上下文转换之后应用,因此可以更改上下文转换的效果。
  4. CALCULATE 在初始计值上下文环境中计算所有显式筛选器参数
    CALCULATE 将这一步的结果应用于步骤 3 之后生成的新筛选上下文。一旦发生了上下文转换,这些筛选器参数就会应用到新的筛选上下文中覆盖转换生成的上下文。这个过程发生在步骤 3 之后,也就是 ALL 系列函数移除上下文和模型关系结构更新之后,所以这一步生成的上下文不会被 ALL 影响。同时,筛选器参数的计算发生在原始筛选上下文中,不受同一 CALCULATE 中任何其他调节器或筛选器的影响。

最终,CALCULATE 在步骤 4 生成的筛选上下文中计值第一参数。

38
说点什么

1000
 
鼓掌微笑开心憧憬爱你色并不觉得吃瓜doge二哈喵喵思考笑哭捂脸悲伤大哭抓狂汗偷笑打脸捂眼黑线问号晕拜拜闭嘴衰咒骂ok作揖
12 评论数
30 被回复的评论
9 订阅评论的人数
 
查看最近回复
查看最热评论
  订阅本文评论  
最新 最旧 得票最多
提醒
成员
xifeng

老师,能帮我看下下图里的计值流程吗,当CALCULATE内部的多个筛选器不是对同一列进行筛选的时候我能理解,但是当内部的多个筛选器以及外部的筛选器都是对同一列进行筛选的时候,我就有些难以理解了。

1、在内外部筛选器都是筛选同一列的情况下,内部筛选器应该是要覆盖外部筛选器的,但是有多个内部筛选器时,所有的内部筛选器都要覆盖外部筛选器吗?然后内部筛选器再相交?

2、在有多个内部筛选器且内外部筛选器都是筛选同一列的情况下,若某个内部筛选器还使用了KEEPFILTERS将覆盖改成了相交,那么此时,内部筛选器与外部筛选器之间,是先相交还是先覆盖?,处理完外部的筛选器后,内部筛选器再相交?

今天被这个问题折磨的有点厉害,我所理解的DAX理论体系竟然不能解释这个问题 捂脸

2.jpg
成员
180****3919

老师,我使用这个例子按计值流理解一下看看有没有问题;
假如外部有个【颜色】做行标签;
Test :=
CALCULATE (
SUM ( ‘销售明细'[下单数量] ),
FILTER (
ALL ( ‘销售明细’ ),
‘销售明细'[出库日期]
= MAX ( ‘销售明细'[出库日期] )
)
)
1、复制原始筛选上下文;——复制【颜色】筛选器A
2、calculate上下文转换;—–没有行上下文,跳过
3、计算调节器函数—–ALL(表)忽略所有的筛选器,忽略步骤1的筛选器A;如果有步骤2,步骤2上下文也会被覆盖;
4、在初始上下文中计算所有显式筛选器——“初始环境”目前只有筛选器A,在筛选器环境下,计算max(日期),获得filter筛选表;
5、生成计值的最终上下文,计算第一参数;—–在步骤3的筛选器条件下,计算对象是步骤4的筛选表,按第一参数计算出结果;

成员
qingkou55

老师,您上面5个步骤中第一点是对整个步骤的综述还是就是步骤的第一步?
另外下面两点也麻烦您澄清一下:
用到的上下文环境:calculate外部筛选上下文A,calculate行上下文转换B,calculate内部筛选器(不含调节器)C,calculate调节器D:
1、显式筛选器包含外部筛选上下文A、行上下文转换的隐式筛选器B和calculate内部筛选器C还是只是A和B或A和C两部分?
2、calculate有调节器D存在时,计算顺序怎样?calculate内部筛选器C计算了几次?
我的两个理解如下,不知哪个是对的,还是都不正确:
——1)calculate内部筛选器C在外部筛选上下文A和行上下文转换的隐式筛选器B基础上生成新的筛选上下文E(E为A、B、C交集),调节器D对E进行调节生成F,calculate内部表达式在F上下文中计算;
——2)外部筛选上下文B和行上下文隐式筛选器B生成新的筛选上下文E(E为A、B交集),calculate 调节器D对E进行调节生成F,calculate内部筛选器C在F基础上取交集生成G,calculate内部表达式在G基础上计算。
谢谢!

成员
139****3194

还有下面这段太复杂了:

5. CALCULATE 在初始计值上下文环境中计值所有显式筛选器参数。将它们的结果应用于步骤 4 之后生成的新筛选上下文。

意思是:初始筛选上下文(含上下文转换)跟cal内部筛选器发生作用前,如果cal里有调节器,这时会调节初始的筛选上下文,(例如All类函数,取消其某些字段列的筛选),调前后的初始筛选上下文再和cal内部筛选器发生作用(交集或覆盖)?

谢谢老师

成员
139****3194

谢谢老师,您中的一句:一旦上下文转换创建的所有隐式筛选器都应用于新的筛选上下文,计算就进入步骤 4。

4. 计算调节器函数 USERELATIONSHIP、CROSSFILTER 和 ALL*(ALL 类函数)。这个步骤发生在步骤 3 之后。这非常重要,意味着我们可以通过使用 ALL 来消除上下文转换的影响。CALCULATE 调节器在上下文转换之后应用,因此可以更改上下文转换的效果。

意思:调节器如果采用all 函数,上下文转换创建的所有隐式筛选器将起不到筛选作用吗?

成员
139****3194

计值上下文进入堆栈(生效)的先后顺序是先外部,再上下文转换,最后是内部创建的筛选条件。这是他们计算的顺序。
如果他们都作用同一列,谁的作用更强呢? 是否倒过来,内部筛选条件最大,其次上下文转换,然后外部筛选上下文?多谢老师。

成员
139****3194

老师,请问:
– 初始环境包含筛选上下文和行上下文。如果行上下文没有条件发生转换,且calculate公式里也没有调节器,这时的计值顺序:公式外部的筛选上下文和cal 内部的筛选器共同作用(交集或覆盖)产生新的筛选上下文,对吗?
– 如果初始环境,既有外部筛选上下文,行上下文也发生了筛选转换,请问这时他们和 cal计值顺序是怎样的?先是 行上下文转换后的筛选上下文和外部的筛选上下文发生交集或覆盖,然后再和公式内部的筛选器发生计算吗? 还是外部筛选上下文和公式内部筛选器先计算,然后,行上下文转换后的筛选上下文最后和刚才前面计算的筛选器发生作用,形成最终的筛选器?

谢谢。

成员
wuleiyuan

”新的筛选上下文只包含筛选上下文,由于上下文转换的作用,所有行上下文在筛选上下文中都消失了。“,行上下文转化成筛选上下文。怎么会消失了。。假如有一个10行1列的表,基数是3,那么它就是转化成了 3个条件的筛选,高老师不知地我理解对不,如果不对能解释下吗?谢谢

成员
Rainman1124

这个能够用一个包含所有步骤的案例说明吗?

成员
墨熙

什么时候再更新啊,我等的花儿都开了。 抓狂 抓狂 抓狂

DAX 圣经

导读

初识 DAX

DAX 基础知识

DAX 原理

DAX 高级原理

基础函数类型

迭代函数

CALCULATE 函数

CALCULATE 调节器

基础表函数

条件判断函数

查找匹配函数

时间智能函数

统计类函数

投影函数

分组/连接函数

集合函数

其他函数