Calculate计值流记不住?我提炼成了这6个字!|DAX核心知识

栏目:影视资讯  时间:2022-11-08
手机版

  Power BI和Excel Power 系列交流群。

  请添加小必微信(文末有二维码)拉你入群

  

  - 1 -

  前不久,我在文章《Calculate计值流,DAX最重要知识点,没有之一!》里,提到了Calculate计值流的详细过程,并建议大家收藏、背下来(此处请先跳过,读完全文再回头对照理解):

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

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

  2、CALCULATE 复制原始筛选上下文,以准备新的筛选上下文

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

  3、CALCULATE 执行上下文转换

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

  4、计算调节器函数 USERELATIONSHIP、CROSSFILTER 和 ALL 类函数

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

  5、CALCULATE 将步骤 1 的结果应用于步骤4 之后生成的新筛选上下文

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

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

  但很多朋友反映,这真的太难了,计值步骤那么多,每一个步骤里又写那么长,哪儿记得住啊!

  

  的确,我也是看了好多遍,还结合好多个案例才撸直的。所以,我就想啊,能不能再总结、提炼一下,换个更加简洁、精P的说法,让大家也方便好记、按部就班用起来?

  - 2 -

  经过一番冥思苦想——真的是想了很多个版本,推翻再来好多次,终于将计值流的6个步骤,总结成了6个字:

  备、拷、转、调、叠、算!

  这里先简单说一下这6个字(步骤)的基本含义,后面我们再结合一个实际的例子配合讲解:

  备:准备好显式筛选器,特别要注意的一点是,这里显式筛选器是在原始上下文中计算的!

  拷:拷贝原有筛选上下文;

  转:转换原行上下文为筛选上下文;

  调:调节器函数起作用,调整原有上下文效果;

  叠:叠加步骤1准备好的显式筛选上下文结果。

  算:计算表达式

  - 3 -

  接下来我们用一个简单的数据和例子来体验一下:

  用Calculate写个DAX公式并对照一下其结果:

  

  大家可能会觉得很奇怪,为什么:

  小勤A产品的销量 = 大海A产品的销量?

  牛大力B产品的销量 = 大海B产品的销量?

  C、D产品为什么都没有出现?

  ……

  这里面,我们结合上面总结的6个字(步骤)来理解一下为什么结果是这样:

  Step 1-备:在原始上下文计算显式筛选器

  这里只有一个显式筛选器,即:

  原始上下文包括“姓名”、“产品”,但这里显式筛选器是对【ALL('产品销量'[姓名])】进行筛选,即只针对全部的姓名内容筛选,跟“产品”也没什么关系。

  所以,这个准备好的显式筛选器的结果就是:姓名=“大海”。

  注意,这里只是准备好,但还没有真正起作用!真正起作用要到第5步。

  Step 2-拷:拷贝筛选上下文

  这里的外部筛选上下文包括“姓名”和“产品”,会被直接沿用进来。

  Step 3-转:转换行上下文

  这个例子里Calculate函数的外部没有行上下文,所以,这里没有发生任何事情,即不需要考虑转换的问题。

  ——后面我会用有行上下文的案例继续跟大家讲解。

  Step 4-调:调节器函数起作用

  这个例子里有一个调节器参数:

  注意,前面第1步显式表达式FILTER里的ALL('产品销量'[姓名])不是调节器,只有属于Calculate函数的独立参数才是调节器。

  这里ALL('产品销量'[姓名]),即删除了Step-2里拷贝的“姓名”筛选器的影响,结果相当于,无论对于谁的产品销量,都只跟产品有关系,跟姓名没关系(该产品所有人的销量之和),如果没有进一步的影响,此时的结果如下:

  

  但这里的姓名筛选器会被进一步覆盖,请看第5步。

  Step 5-叠:叠加第1步准备好的显式筛选器

  前面在第1步准备显式筛选器(姓名=“大海”)的时候,说了,那时筛选器只是准备好了,还没起作用,到了这里,终于派上用场了——覆盖前面的“姓名”筛选器,即此时最终的筛选器为:姓名 = "大海"、产品。

  注意,这里说覆盖,是因为在此之前,“姓名”筛选器一直存在(如果原来不存在,那这里会直接增加),此时,所有计算上下文的结果如下:

  Step 6-算:计算表达式。

  这一步就简单了,即在上面确定的上下文进行计算,得到最终结果,如下图所示:

  

  - 4 -

  Calculate函数,可能算是DAX学习过程中最难但却也是最重要的知识点了,无论如何,都要充分理解它的计值过程。

  这里总结成6个字,虽然简洁了不少,但也不大可能通过几个例子就能充分理解,只是希望,大家以后能在碰到这个函数所写的表达式时,可以条件反射的按照这6个步骤去分析,最终理解为什么会得到那样的结果。

  最后,再重温一下这6个字(也可以再回到文章开头,结合“官方”版的计值流说明进行对照理解):

  备、拷、转、调、叠、算

  为方便记忆,我结合谐音,进一步想了个“吃货”版,加上配图,方便大家加强记忆,希望对大家有所帮助:

  备烤串,调碟蒜。

  

  

  关注公众号,发送“数据”,即可获取本文案例材料。

  END

上一篇:四部好看的韩剧,《治愈者》在列,你最喜欢哪一部?
下一篇:中国最后一个藩属国:1947年还在进贡,今称将永远无条件支持中国

最近更新影视资讯