CALCULATE的語(yǔ)法結(jié)構(gòu)
語(yǔ)法:
CALCULATE(<expression>,<filter1>,<filter2>…)
- 第一個(gè)參數(shù)是計(jì)算表達(dá)式,可以執(zhí)行各種聚合運(yùn)算
- 從第二個(gè)參數(shù)開始,是一系列篩選條件,可以為空;如果多個(gè)篩選條件,用逗號(hào)分隔
- 所有曬選條件的交集形成最終的篩選數(shù)據(jù)集合
- 根據(jù)篩選出的數(shù)據(jù)集合執(zhí)行第一個(gè)參數(shù)的聚合運(yùn)算并返回運(yùn)算結(jié)果
前文提到DAX函數(shù)可以更改外部上下文,現(xiàn)在通過實(shí)例來(lái)理解DAX中最精髓的函數(shù)CALCULATE的計(jì)算原理,并看看它是如何更改外部上下文的。
CALCULATE應(yīng)用實(shí)例
導(dǎo)入下面這個(gè)產(chǎn)品明細(xì)表:

新建一個(gè)度量值求每種產(chǎn)品的數(shù)量:
產(chǎn)品數(shù)量 = COUNTROWS('產(chǎn)品明細(xì)')
因?yàn)槊糠N產(chǎn)品的只有1行,所以求產(chǎn)品明細(xì)表的行數(shù)就相當(dāng)于求各種產(chǎn)品的數(shù)量,把產(chǎn)品名稱和該度量值拖拽入矩陣表,

這里外部上下文就是表格每行的行標(biāo)簽。
01 | 篩選條件為空,不影響外部上下文
現(xiàn)在開始用CALCULATE函數(shù)創(chuàng)建一個(gè)度量值:
產(chǎn)品數(shù)量1 = CALCULATE([產(chǎn)品數(shù)量])
只是用了第一個(gè)參數(shù),篩選條件為空,因?yàn)闆]有內(nèi)部篩選所以完全依賴外部上下文,出來(lái)的結(jié)果也和原度量值一致。

另外,介紹CALCULATE語(yǔ)法的時(shí)候說,第一個(gè)參數(shù)為聚合運(yùn)算表達(dá)式,為什么這里沒有用聚合函數(shù)而只用了一個(gè)度量值呢?這是因?yàn)槎攘恐礫產(chǎn)品數(shù)量]本身就是一個(gè)聚合函數(shù)運(yùn)算,實(shí)際上度量值[產(chǎn)品數(shù)量1]等同于這個(gè):
產(chǎn)品數(shù)量1 = CALCULATE(COUNTROWS('產(chǎn)品明細(xì)'))
DAX函數(shù)可以直接引用已經(jīng)創(chuàng)建好的度量值,可以使DAX函數(shù)看起來(lái)更簡(jiǎn)潔、更具可讀性,這也是建議從最簡(jiǎn)單的度量值開始建的原因。
02 | 添加限制條件,縮小上下文
建一個(gè)度量值[產(chǎn)品數(shù)量2],
產(chǎn)品數(shù)量2 = CALCULATE([產(chǎn)品數(shù)量],'產(chǎn)品明細(xì)'[品牌]="蘋果")

發(fā)現(xiàn)只有蘋果的產(chǎn)品計(jì)數(shù)顯示出來(lái),而其他品牌的數(shù)據(jù)沒有了,這是因?yàn)镃ALCULATE的第二個(gè)參數(shù)的限制,只篩選品牌為“蘋果”的,限制了外部的上下文,非蘋果的產(chǎn)品都不再運(yùn)算。
03 | 結(jié)合ALL函數(shù),擴(kuò)大上下文
新建度量值[產(chǎn)品數(shù)量3],
產(chǎn)品數(shù)量3 = CALCULATE([產(chǎn)品數(shù)量],ALL('產(chǎn)品明細(xì)'))

這次的數(shù)據(jù)居然是所有產(chǎn)品的數(shù)量,這是因?yàn)楹Y選條件使用了ALL函數(shù),ALL('產(chǎn)品明細(xì)')的意思是清除產(chǎn)品明細(xì)表里的所有篩選,外部篩選器不起作用了,每行統(tǒng)計(jì)的都是該表中的所有產(chǎn)品。
每行的數(shù)據(jù)都是9,你可能覺得這個(gè)ALL函數(shù)沒什么用,運(yùn)算的數(shù)據(jù)沒有什么意義,會(huì)誤導(dǎo)人,實(shí)際上當(dāng)然不是這樣,這個(gè)數(shù)據(jù)使用的地方非常多,比如我們想計(jì)算每個(gè)產(chǎn)品數(shù)量占總產(chǎn)品數(shù)量的比重,直接寫個(gè)度量值:
產(chǎn)品占比=[產(chǎn)品數(shù)量]/[產(chǎn)品數(shù)量3]

產(chǎn)品占比就計(jì)算出來(lái)了,這就是統(tǒng)計(jì)總數(shù)的一個(gè)功能。
04 | 重置上下文
新建度量值[產(chǎn)品數(shù)量4],
產(chǎn)品數(shù)量4 = CALCULATE([產(chǎn)品數(shù)量],
all('產(chǎn)品明細(xì)'[產(chǎn)品名稱]),
'產(chǎn)品明細(xì)'[類別]="手機(jī)")
先用ALL函數(shù)清除外部上下文,然后又新增了一個(gè)篩選條件,類別為"手機(jī)"的產(chǎn)品數(shù)量,那么結(jié)果會(huì)是什么樣的呢,

每一行產(chǎn)品的數(shù)量都是3,正好符合建立這個(gè)度量值的邏輯,被ALL清除行標(biāo)簽的外部篩選后,從全部產(chǎn)品中統(tǒng)計(jì)品類為"手機(jī)"的產(chǎn)品的數(shù)量,所以每行都返回3.
通過以上幾個(gè)簡(jiǎn)單的例子,可以領(lǐng)會(huì)到CALCULATE的計(jì)算邏輯,通過從第二個(gè)參數(shù)開始的篩選條件,得到一個(gè)數(shù)據(jù)集合,并利用第一個(gè)參數(shù)執(zhí)行聚合運(yùn)算,這不就是DAX要實(shí)現(xiàn)的功能:提取有用數(shù)據(jù)并執(zhí)行聚合運(yùn)算嗎,所以說CALCULATE幾乎就是DAX本身,它就是實(shí)現(xiàn)DAX功能的引擎,并能靈活的操控外部上下文,后面的數(shù)據(jù)分析也都離不開CALCULATE的身影。








暫無(wú)數(shù)據(jù)