前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >CALCULATE函数这个带行下文的简单公式,可能90%的人都没搞懂怎么算的! | DAX实战

CALCULATE函数这个带行下文的简单公式,可能90%的人都没搞懂怎么算的! | DAX实战

作者头像
大海Power
发布2022-05-25 14:44:43
发布2022-05-25 14:44:43
1.9K0
举报

一个使用了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个步骤得到了都一样的最终筛选器,所以,对于每一行,计算结果就是针对所有产品大类为“文具”的产品对应的订单明细的销售额之和。

以上就是对这个看是简单公式的全部剖析过程,和你的理解是一样的吗?欢迎留言讨论,互相学习,共同进步!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Excel到PowerBI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档