精品丨CALCULATE——上下文扩展
之前关于CALCULATE的函数写过很多期,白茶在梳理知识点的时候,发现漏掉了一个需要描述的地方,本期将会对这个遗漏的地方进行补充说明。
CALCULATE衍生的上下文扩展
最开始接触这个问题的时候,大概还是在2019年。
那次白茶和@嘿神闲聊的时候,嘿神曾提及过这个问题,就是CALCULATE函数尽量不要再次嵌套CALCULATE函数,不然会出现不可预知的错误,且对于初学者来说这个问题不利于理解排查。
当时白茶没意识到这个问题的严重性,直到近期和@冬哥闲聊的时候再次遇到这个问题,白茶才明白这个问题点出在哪里。
可能小伙伴看到这里还是云里雾里的,别急,看下面的例子。
案例数据:
这是白茶准备的案例数据,非常的简单,小伙伴可以动手模拟一下。
问题:
下面这四段代码返回的结果分别是什么?
代码1:
Question.1 =
CALCULATE ( CALCULATE ( SUM ( '案例'[价格] ), '案例'[名称] = "奶茶" ), '案例'[类别] = "饮品" )
代码2:
Question.2 =
CALCULATE ( CALCULATE ( SUM ( '案例'[价格] ), '案例'[名称] = "奶茶" ), '案例'[名称] = "面包" )
代码3:
Question.3 =
CALCULATE (
CALCULATE ( SUM ( '案例'[价格] ), '案例'[名称] = "奶茶" ),
FILTER ( ALL ( '案例' ), '案例'[类别] = "食物" )
)
代码4:
Question.4 =
CALCULATE (
CALCULATE ( SUM ( '案例'[价格] ), FILTER ( ALL ( '案例' ), '案例'[名称] = "奶茶" ) ),
FILTER ( ALL ( '案例' ), '案例'[名称] = "面包" )
)
思考一下
1
2
3
...
答案:
代码1:
代码2:
代码3:
代码4:
小伙伴们,猜对了么?
那么这四段代码的内部逻辑是什么?
解释:
代码1:
此时内部的上下文是“奶茶”,而外部上下文是“饮品”,内外上下文不冲突,外部上下文先执行,与内部上下文取交集,因此结果返回“15”。
代码2:
此时内部的上下文是“奶茶”,而外部上下文是“面包”,内外上下文冲突,外部上下文先执行,内部上下文覆盖掉外部上下文,因此结果返回“15”。
代码3:
此时内部的上下文是“奶茶”,而外部上下文是“食物”,内外上下文不冲突,外部上下文先执行,与内部上下文取交集,两个上下文此时交集为空,因此结果返回“空”。
代码4:
此时内部的上下文使用了ALL,筛选条件是“奶茶”;
而外部上下文也使用了ALL,筛选条件是“面包”;
内外上下文冲突,外部上下文先执行,内部上下文覆盖掉外部上下文,因此结果返回“15”。小伙伴们,看明白了么?
通常情况下,外部上下文先执行,内部上下文后执行;
一旦内外上下文冲突,后执行的内部上下文会覆盖掉先执行的外部上下文。
因此使用CALCULATE函数的时候,如果多层嵌套,切记上下文冲突的问题。
小伙伴们❤GET了么?
白茶会不定期的分享一些函数卡片
(文件在知识星球[PowerBI丨需求圈])
这里是白茶,一个PowerBI的初学者。