[知识体系] CALCULATE 指南

  [复制链接]
查看90356 | 回复109 | 2021-2-21 19:03:58 | 显示全部楼层 |阅读模式
本文是 CALCULATE 系列的最后一篇,是时候提供关于这个函数全面总结了。之后你在浏览其他文章的时候,很可能会多次回来参考本文的内容,不必担心,这是正常的。每当需要回忆 CALCULATE 的复杂行为时,你都可以在这里找到答案。


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

CALCULATE 总结
初始环境

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

创建新的筛选上下文

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

接受三种参数

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


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


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


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

执行上下文转换

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

CALCULATE 计值流



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


  • CALCULATE 在初始计值上下文环境中的计算所有显式筛选器参数

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

    这个过程中会丢弃原始行上下文,因为新的计值上下文将不包含任何行上下文。
  • CALCULATE 执行上下文转换

    CALCULATE 使用列在原始行上下文中的当前值,为正在迭代的所有列提供一个具有唯一值的筛选器。值得注意的是此筛选器可能包含也可能不包含单个行,因为上下文转换并不保证新的筛选上下文只包含一行。如果没有正在生效的行上下文,则跳过此步骤。一旦上下文转换创建的所有隐式筛选器都应用于新的筛选上下文,计算就进入步骤 4。
  • 计算调节器函数 USERELATIONSHIP、CROSSFILTER 和 ALL 类函数

    这个步骤发生在步骤 3 之后。这非常重要,意味着我们可以通过使用 ALL 来消除上下文转换的影响。CALCULATE 调节器在上下文转换之后应用,因此可以更改上下文转换的效果。
  • CALCULATE 将步骤 1 的结果应用于步骤 4 之后生成的新筛选上下文

    一旦发生了上下文转换,这些筛选器参数就会应用到新的筛选上下文中覆盖转换生成的上下文。这个过程发生在步骤 4 之后,也就是 ALL 系列函数移除上下文和模型关系结构更新之后,所以这一步生成的上下文不会被 ALL 影响。同时,筛选器参数的计算发生在原始筛选上下文中,不受同一 CALCULATE 中任何其他调节器或筛选器的影响。


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

使用道具 举报

sczgx6658 | 2021-4-24 16:36:43 | 显示全部楼层
我了个去,顶了
回复

使用道具 举报

ngls43 | 2021-4-26 20:23:26 来自手机 | 显示全部楼层
路过的帮顶
回复

使用道具 举报

shirley | 2021-6-29 07:28:49 来自手机 | 显示全部楼层
看帖要回,回帖才健康,在踩踩,楼主辛苦了!
回复

使用道具 举报

n煲 | 2021-7-22 06:22:54 | 显示全部楼层
太棒了,感谢唐楼主精彩的分享
回复

使用道具 举报

xilu168 | 2021-9-1 06:57:32 | 显示全部楼层
楼下的接上
回复

使用道具 举报

阿敏 | 2021-9-3 23:25:47 来自手机 | 显示全部楼层
路过 帮顶 嘿嘿
回复

使用道具 举报

liruotong | 2021-10-29 17:15:47 来自手机 | 显示全部楼层
是爷们的娘们的都帮顶!大力支持
回复

使用道具 举报

wwolf | 2021-11-1 17:29:44 | 显示全部楼层
确实不错,顶先
回复

使用道具 举报

wds | 2021-11-3 16:31:30 | 显示全部楼层
回个帖子支持一下!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则