DAX里的CALCULATE函数,无疑是最强大、最重要、最灵活而又最难懂的函数,没有之一。
对于想要真正将Power BI学以致用的朋友,这也是务必要攻克的难点:从了解它的计算过程,到通过大量的案例实践来巩固并达到灵活运用,甚至形成一些常用套路。
后续我会用常见的一些工作实战案例,来讲解各种情况下的CALCULATE函数套路,希望对大家有所帮助。
今天,我们来讲这么一个例子(示例数据下载链接:https://share.weiyun.com/PLdpvDP3):
计算某工人所在的工序设备下的所有人的总工时,但在结果表中要隐藏工序设备,如下图所示:
其中左边为明细表,即在4月20日的早班,大海在工序1、机床1上搬砖3小时,同时在工序1、机床1上搬砖的还有大牛和小勤分别搬砖1小时、2小时;要求右边结果表,如4月20日早班,大海所在的工序1、机床1上,所有人的总工时(如上图中结果6 = 3+1+2,但注意,结果表里不体现工序和机床)。
这个问题在计算占比的情况下比较常见,但要求上有其特殊的地方:一般情况,计算占比时,为了其中的总值,通过ALL函数直接删除某维度的影响即可,但这里,结果表中直接删除姓名维度的影响,显然是不行的,因为还要考虑与姓名相关的工序、设备维度的影响——这很有点儿“又要马儿跑,又要马儿不吃草”的意思!
这个看起来有点儿矛盾的问题,如果理解了CALCULATE函数的计算过程,其实也不难。思考过程如下:
1、首先,我们显然要先取得当前条件下的工序、设备值,作为计算结果的筛选条件——这可以通过VALUES函数来实现:
2、然后,我们要忽略工人的影响,这可以通过ALL函数来实现:
就这么简单?——对,就这么简单!但是,我相信一定会有些朋友产生以下疑问:为什么VALUES取到的工序、设备,是在结果表当前行下的工人(如第1行,大海)的工序和设备?后面不是用ALL函数忽略了工人的影响了吗?
——这是很多初学者最容易混淆的问题之一:
对于CALCULATE函数后面的筛选器参数,它们是有一定的计算顺序的,而不是相互影响的!其计算顺序为:
先在原始上下文上计算显式筛选器(如这里的VALUES工序、设备),最后再使用调节器函数调整筛选器(如这里的ALL和以后要讲的KEEPFILTERS等)。
所以,这里用VALUES函数取工序、设备的值时,是在结果表当前的筛选器条件下得到的值(如大海,对应的工序1、机床1),而不是删除姓名筛选器情况下的结果。
前段时间,我发表了文章《666,Calculate计值流记不住?我提炼成了这6个字!| DAX核心知识》,说实话,这是我耗费特别大精力写作的将原理转化为相对容易理解、实战的文章之一,建议大家多看看。同时对照其中CALCULATE函数的6个计值步骤,再回头看一下本案例的内容,可能非常有助于加深理解哦。
本文分享自 Excel到PowerBI 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!