CALCULATE函數的運算順序-第一彈

CALCULATE函數應該算是DAX語言中用的最廣,最神奇,也最容易理解出錯的一個函數。它具有重新設定篩選上下文,並且將行上下文轉換爲篩選上下文的能力。

在DAX函數中,絕大多數函數的執行順序都是從左到右依次進行,例如SUMX函數SUMX(<table>,<expression>),如果table參數處使用了一個可以返回表單的表達式,則在運行時Power BI會先將這個表單表達式的結果計算出來,之後再計算expression參數部分。而CALCULATE函數CALCULATE(<expression>,<filter1>,<filter2>…)則很特殊,Power BI會先對後面的filter參數部分進行計算,之後纔會運行expression表達式部分。

CALCULATE函數這種獨特的從“右”到“左”的運算順序會對運算結果產生什麼樣的影響呢?且看下面這個表單例子。

TotalSales = SUM('Sales SalesOrderHeader'[TotalDue])

在這裏插入圖片描述
如果創建下面這個度量值C1來計算France的產品銷量,猜猜會有什麼樣的結果。

C1 =
CALCULATE (
    [TotalSales],
    'Sales SalesTerritory'[Name] = "France"
)

hmm,一般覺得應該只有France這一行有相應的計算結果,而其他國家對應的值都是空?但其實結果如下圖所示:

在這裏插入圖片描述
對比第一張圖的原始數據,France這一行的計算結果是沒有問題的,但是其他國家的值也都被賦予了France的對應的銷量值。

之所以出現這樣的結果就是跟CALCULATE函數的篩選表達式使用布爾函數時,其含義相當於調用了FILTER函數並使用了ALL函數作爲FILTER函數內的篩選條件。按照這個邏輯,前面的C1表達式等同於下面這個包含C2表達式:

C2 =
CALCULATE (
    [TotalSales],
    FILTER (
        ALL ( 'Sales SalesTerritory'[Name] ),
        'Sales SalesTerritory'[Name] = "France"
    )
)

之前說過,CALCULATE函數的計算順序是從“右”到“左”,所以Power BI在對C2進行運算時,會先計算FILTER函數部分。FILTER裏面有一個超級無敵去篩選條件的ALL函數,所以在這個函數的作用下,外面的篩選上下文對計算結果都將起不到過濾作用。此時,FILTER函數的返回結果變成了只包含’Sales SalesTerritory’[Name] = "France"的子表單,這樣,內嵌度量值[TotalSales]的計算範圍就被限定到了只針對France列數據進行聚合,所以無論外圍可視化表單設定了何種篩選條件,C1和C2都只會執着的顯示8119749.346這個結果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章