介紹DAX的時候,特別強調(diào)過一個重要的函數(shù):CALCULATE,本文就來揭秘這個函數(shù)的計算原理以及它是如何影響上下文的。
CALCULATE的語法結(jié)構(gòu)
語法:
CALCULATE(,,…)
第一個參數(shù)是計算表達式,可以執(zhí)行各種聚合運算
從第二個參數(shù)開始,是一系列篩選條件,可以為空;如果多個篩選條件,用逗號分隔
所有曬選條件的交集形成最終的篩選數(shù)據(jù)集合
根據(jù)篩選出的數(shù)據(jù)集合執(zhí)行第一個參數(shù)的聚合運算并返回運算結(jié)果
前文提到DAX函數(shù)可以更改外部上下文,現(xiàn)在通過實例來理解DAX中最精髓的函數(shù)CALCULATE的計算原理,并看看它是如何更改外部上下文的。
CALCULATE應(yīng)用實例
導(dǎo)入下面這個產(chǎn)品明細表:
新建一個度量值求每種產(chǎn)品的數(shù)量:
產(chǎn)品數(shù)量 = COUNTROWS('產(chǎn)品明細')
因為每種產(chǎn)品的只有1行,所以求產(chǎn)品明細表的行數(shù)就相當于求各種產(chǎn)品的數(shù)量,把產(chǎn)品名稱和該度量值拖拽入矩陣表,
這里外部上下文就是表格每行的行標簽。
01 | 篩選條件為空,不影響外部上下文
現(xiàn)在開始用CALCULATE函數(shù)創(chuàng)建一個度量值:
產(chǎn)品數(shù)量1 = CALCULATE([產(chǎn)品數(shù)量])
只是用了第一個參數(shù),篩選條件為空,因為沒有內(nèi)部篩選所以完全依賴外部上下文,出來的結(jié)果也和原度量值一致。
另外,介紹CALCULATE語法的時候說,第一個參數(shù)為聚合運算表達式,為什么這里沒有用聚合函數(shù)而只用了一個度量值呢?這是因為度量值[產(chǎn)品數(shù)量]本身就是一個聚合函數(shù)運算,實際上度量值[產(chǎn)品數(shù)量1]等同于這個:
產(chǎn)品數(shù)量1 = CALCULATE(COUNTROWS('產(chǎn)品明細'))
DAX函數(shù)可以直接引用已經(jīng)創(chuàng)建好的度量值,可以使DAX函數(shù)看起來更簡潔、更具可讀性,這也是建議從最簡單的度量值開始建的原因。
02 | 添加限制條件,縮小上下文
建一個度量值[產(chǎn)品數(shù)量2],
產(chǎn)品數(shù)量2 = CALCULATE([產(chǎn)品數(shù)量],'產(chǎn)品明細'[品牌]="蘋果")
發(fā)現(xiàn)只有蘋果的產(chǎn)品計數(shù)顯示出來,而其他品牌的數(shù)據(jù)沒有了,這是因為CALCULATE的第二個參數(shù)的限制,只篩選品牌為“蘋果”的,限制了外部的上下文,非蘋果的產(chǎn)品都不再運算。
03 | 結(jié)合ALL函數(shù),擴大上下文
新建度量值[產(chǎn)品數(shù)量3],
產(chǎn)品數(shù)量3 = CALCULATE([產(chǎn)品數(shù)量],ALL('產(chǎn)品明細'))
這次的數(shù)據(jù)居然是所有產(chǎn)品的數(shù)量,這是因為篩選條件使用了ALL函數(shù),ALL('產(chǎn)品明細')的意思是清除產(chǎn)品明細表里的所有篩選,外部篩選器不起作用了,每行統(tǒng)計的都是該表中的所有產(chǎn)品。
每行的數(shù)據(jù)都是9,你可能覺得這個ALL函數(shù)沒什么用,運算的數(shù)據(jù)沒有什么意義,會誤導(dǎo)人,實際上當然不是這樣,這個數(shù)據(jù)使用的地方非常多,比如我們想計算每個產(chǎn)品數(shù)量占總產(chǎn)品數(shù)量的比重,直接寫個度量值:
產(chǎn)品占比=[產(chǎn)品數(shù)量]/[產(chǎn)品數(shù)量3]
產(chǎn)品占比就計算出來了,這就是統(tǒng)計總數(shù)的一個功能。
04 | 重置上下文
新建度量值[產(chǎn)品數(shù)量4],
產(chǎn)品數(shù)量4 = CALCULATE([產(chǎn)品數(shù)量],
all('產(chǎn)品明細'[產(chǎn)品名稱]),
'產(chǎn)品明細'[類別]="手機")
先用ALL函數(shù)清除外部上下文,然后又新增了一個篩選條件,類別為"手機"的產(chǎn)品數(shù)量,那么結(jié)果會是什么樣的呢,
每一行產(chǎn)品的數(shù)量都是3,正好符合建立這個度量值的邏輯,被ALL清除行標簽的外部篩選后,從全部產(chǎn)品中統(tǒng)計品類為"手機"的產(chǎn)品的數(shù)量,所以每行都返回3.
通過以上幾個簡單的例子,可以領(lǐng)會到CALCULATE的計算邏輯,通過從第二個參數(shù)開始的篩選條件,得到一個數(shù)據(jù)集合,并利用第一個參數(shù)執(zhí)行聚合運算,這不就是DAX要實現(xiàn)的功能:提取有用數(shù)據(jù)并執(zhí)行聚合運算嗎,所以說CALCULATE幾乎就是DAX本身,它就是實現(xiàn)DAX功能的引擎,并能靈活的操控外部上下文,后面的數(shù)據(jù)分析也都離不開CALCULATE的身影。








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