一个使用了CALCULATE函数的公式,到底是怎么样计算得到它的结果的?如果没有真正搞懂CALCULATE函数计值流(计算过程)的话,即使这个公式很简单,也可能会无法理解!
比如下面这个例子,建一个计算列(带行上下文)写的简单公式,如果你把它的计算过程搞清楚了,相信你对CALCULATE函数的理解又进了一大步。
首先,这个例子涉及的数据很简单,只有“产品”和“订单明细”两张表,两张表通过“产品名称”建立了一对多的关系:
现在,在产品名称表里建一个计算列,公式很简单:
问题是,为什么算出来的全都是6000?这个公式的计算过程到底是怎样的?
建议自己先尝试画一下计算过程,看看跟我下面的分析是否一致。
前面,我写过关于CALCULATE函数计值流的文章:《666,Calculate计值流记不住?我提炼成了这6个字!| DAX核心知识》。其中,关于CALCULATE函数的计值流,提炼为“备、拷、转、调、叠、算”:
下面,我们再用这个方法,来剖析这个计算列的计算过程:
1、“备”:准备显式筛选器
显然,这个公式里只有一个显式筛选器参数:
这个参数会在原始的上下文中进行计算,这里原始上下文没有筛选上下文,只有行上下文,也就是说,筛选器【FILTER('产品表','产品表'[产品大类]="文具")】是在当前行上下文进行计算的,但是,行上下文本身并不能对表进行筛选。
所以,对于每一行,都会筛选出产品大类为文具的表,这个表包括“产品名称”、“产品大类”、“销售额”三列,即会生成3个对应的筛选器,且这些筛选器对应的值为筛选结果表中列的所有值:
2、“拷”:拷贝原有筛选上下文
这里没有筛选上下文,所以这一步跳过。
3、“转”:转换原有行上下文为筛选上下文
这里的行上下文涉及产品表当前所有字段,转换后的筛选上下文自然包括“产品名称”、“产品大类”、“销售额”三个字段,对于每一行来说,这些筛选上下文的值,就是当前行这些字段对应的值:
4、“调”:调节器起作用
这里没有调节器,所以这一步跳过。
5、“叠”:叠加步骤1准备好的显式筛选器
这是最关键的一步!
前面步骤1,得到了“产品名称”、“产品大类”、“销售额”三个筛选器;步骤3,原始行上下文转换还是生成了“产品名称”、“产品大类”、“销售额”三个筛选器!
因为步骤1生成的三个筛选器与步骤3转换得到的三个筛选器完全一样,叠加时,相同的筛选器会被覆盖,所以,步骤1计算得到的筛选器会“覆盖”步骤3行上下文转换生成的筛选器,最终,对于每一行,叠加得到的筛选器均为步骤1筛选的表结果:
以上5个步骤的过程可综合如下图所示:
6、“算”
通过上面的分析,对于每一行,CALCULATE函数的5个步骤得到了都一样的最终筛选器,所以,对于每一行,计算结果就是针对所有产品大类为“文具”的产品对应的订单明细的销售额之和。
以上就是对这个看是简单公式的全部剖析过程,和你的理解是一样的吗?欢迎留言讨论,互相学习,共同进步!
本文分享自 Excel到PowerBI 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!