之前關(guān)于CALCULATE的函數(shù)寫(xiě)過(guò)很多期,白茶在梳理知識(shí)點(diǎn)的時(shí)候,發(fā)現(xiàn)漏掉了一個(gè)需要描述的地方,本期將會(huì)對(duì)這個(gè)遺漏的地方進(jìn)行補(bǔ)充說(shuō)明。
傳送門(mén):《精品丨CALCULATE函數(shù)進(jìn)階版知識(shí)》
CALCULATE衍生的上下文擴(kuò)展
最開(kāi)始接觸這個(gè)問(wèn)題的時(shí)候,大概還是在2019年。
那次白茶和@嘿神閑聊的時(shí)候,嘿神曾提及過(guò)這個(gè)問(wèn)題,就是CALCULATE函數(shù)盡量不要再次嵌套CALCULATE函數(shù),不然會(huì)出現(xiàn)不可預(yù)知的錯(cuò)誤,且對(duì)于初學(xué)者來(lái)說(shuō)這個(gè)問(wèn)題不利于理解排查。
當(dāng)時(shí)白茶沒(méi)意識(shí)到這個(gè)問(wèn)題的嚴(yán)重性,直到近期和@冬哥閑聊的時(shí)候再次遇到這個(gè)問(wèn)題,白茶才明白這個(gè)問(wèn)題點(diǎn)出在哪里。
可能小伙伴看到這里還是云里霧里的,別急,看下面的例子。
案例數(shù)據(jù):
這是白茶準(zhǔn)備的案例數(shù)據(jù),非常的簡(jiǎn)單,小伙伴可以動(dòng)手模擬一下。
問(wèn)題:
下面這四段代碼返回的結(jié)果分別是什么?
代碼1:
Question.1 =
CALCULATE ( CALCULATE ( SUM ( '案例'[價(jià)格] ), '案例'[名稱(chēng)] = "奶茶" ), '案例'[類(lèi)別] = "飲品" )
代碼2:
Question.2 =
CALCULATE ( CALCULATE ( SUM ( '案例'[價(jià)格] ), '案例'[名稱(chēng)] = "奶茶" ), '案例'[名稱(chēng)] = "面包" )
代碼3:
Question.3 =
CALCULATE (
CALCULATE ( SUM ( '案例'[價(jià)格] ), '案例'[名稱(chēng)] = "奶茶" ),
FILTER ( ALL ( '案例' ), '案例'[類(lèi)別] = "食物" )
)
代碼4:
Question.4 =
CALCULATE (
CALCULATE ( SUM ( '案例'[價(jià)格] ), FILTER ( ALL ( '案例' ), '案例'[名稱(chēng)] = "奶茶" ) ),
FILTER ( ALL ( '案例' ), '案例'[名稱(chēng)] = "面包" )
)
思考一下
1
2
3
...
答案:
代碼1:
代碼2:
代碼3:
代碼4:
小伙伴們,猜對(duì)了么?
那么這四段代碼的內(nèi)部邏輯是什么?
解釋?zhuān)?/strong>
代碼1:
此時(shí)內(nèi)部的上下文是“奶茶”,而外部上下文是“飲品”,內(nèi)外上下文不沖突,外部上下文先執(zhí)行,與內(nèi)部上下文取交集,因此結(jié)果返回“15”。
代碼2:
此時(shí)內(nèi)部的上下文是“奶茶”,而外部上下文是“面包”,內(nèi)外上下文沖突,外部上下文先執(zhí)行,內(nèi)部上下文覆蓋掉外部上下文,因此結(jié)果返回“15”。
代碼3:
此時(shí)內(nèi)部的上下文是“奶茶”,而外部上下文是“食物”,內(nèi)外上下文不沖突,外部上下文先執(zhí)行,與內(nèi)部上下文取交集,兩個(gè)上下文此時(shí)交集為空,因此結(jié)果返回“空”。
代碼4:
此時(shí)內(nèi)部的上下文使用了ALL,篩選條件是“奶茶”;
而外部上下文也使用了ALL,篩選條件是“面包”;
內(nèi)外上下文沖突,外部上下文先執(zhí)行,內(nèi)部上下文覆蓋掉外部上下文,因此結(jié)果返回“15”。小伙伴們,看明白了么?
通常情況下,外部上下文先執(zhí)行,內(nèi)部上下文后執(zhí)行;
一旦內(nèi)外上下文沖突,后執(zhí)行的內(nèi)部上下文會(huì)覆蓋掉先執(zhí)行的外部上下文。
因此使用CALCULATE函數(shù)的時(shí)候,如果多層嵌套,切記上下文沖突的問(wèn)題。
小伙伴們?GET了么?
白茶會(huì)不定期的分享一些函數(shù)卡片
(文件在知識(shí)星球[PowerBI丨需求圈])
這里是白茶,一個(gè)PowerBI的初學(xué)者。
