DAX從入門到精通?5-3-1 理解度量值中的上下文轉(zhuǎn)換

弄明白上下文轉(zhuǎn)換時非常重要的,因為DAX的另外一個重要的功能。目前為止,我們都是在函數(shù)和計算列的calculate中寫表達式,但是,如果你寫的表達式包含了度量值,會怎么樣?在計算列中使用度量值會怎么樣?另外,在存在行上下文的情況下使用度量值會怎么樣?

一個例子,我們可以這樣定義一個度量值 sumofsalesamount:

[SumOfSalesAmount] := SUM ( Sales[SalesAmount] )

然后你可以定義一個計算列,如下

Product[SalesWithSUMX] =
SUMX (
Customer,
CALCULATE ( [SumOfSalesAmount] )
)

calculate的出現(xiàn),提示了有上下文發(fā)生轉(zhuǎn)換的現(xiàn)象。這里的重點時,當你在一個表達式中使用度量值的時候,DAX自動默認把這個表達式外添加一個calculate。因此,上面這個表達式的結(jié)果和下面這個一樣:

Product[SalesWithSUMX] =
SUMX (
Customer,
[SumOfSalesAmount]
)

這次沒有看到calculate了,但是上下文的轉(zhuǎn)換依然會發(fā)生,因為DAX會自動添加一個calculate到計算中。
這就是為什么,你在寫計算列和度量值的時候,要用不同的代碼寫法的原因。DAX書寫的規(guī)律通常要求我們在寫度量值的時候避免添加表的名稱,而寫計算列的時候,要添加表名做為前綴。事實上,在上面的公式中,表名稱的缺失,暗示了 sumofsalesamount時一個度量值,這樣你要預料到上下文轉(zhuǎn)換的發(fā)生。

自動的上下文轉(zhuǎn)換,使得我們對復雜的迭代計算變得簡單化。熟練掌握這個功能需要一些時間。例如,如果你要計算那么買了大于平均值的客戶的總銷售額,你可以這樣寫:

[SalesMoreThanAverage] :=
VAR
AverageSales = AVERAGEX ( Customer, [SumOfSalesAmount] )
RETURN
SUMX (
Customer,
IF (
[SumOfSalesAmount] > AverageSales,
[SumOfSalesAmount]
))

上面這個代碼,我們使用了sumofsalesamount這個度量值,在行上下文環(huán)境中,在變量的定義中,我們使用它啦i計算了客戶的平均銷售額,而在sumx的迭代中,我們使用它來檢測當前客戶的銷售額與之前計算平均值的對比,平均值存儲在變量當中。

重點
基于var的寫法閱讀起來比較簡單且容易維護(實際上運行也快一些)。但是,掌握不同語法使用對于的不同行為是十分重要的,包括不適用var變量,因為有的DAX版本不支持變量。如果你沒有很好的掌握上下文的自動轉(zhuǎn)換,那么你很有可能需要大量的時間來明白一個函數(shù)的意思。

使用度量值的時候會發(fā)生上下文的轉(zhuǎn)換,這個是自動默認的,且沒有辦法去改變它。也就是說,如果要避免上下文的自動轉(zhuǎn)換,唯一的辦法就是把代碼展開。舉個例子,我們把上面的代碼改寫一下,不使用變量,我們使用一個averagesales度量值來代替average sales。代碼如下

[AverageSales] := AVERAGEX ( Customer, [SumOfSalesAmount] )

[SalesMoreThanAverage] :=
SUMX (
Customer,
IF (
[SumOfSalesAmount] > [AverageSales],
[SumOfSalesAmount]
))

我們使用了[averagesales]來計算客戶的平均銷售額,這里的問題是,我們在迭代函數(shù)sumx中使用度量值,這個會使得上下文轉(zhuǎn)換自動發(fā)生。因此,[averagesales]的結(jié)果不是多有客戶的平均值,而是正在迭代中的這個客戶的值。所以結(jié)果就是,if的函數(shù)返回的全部是false,然后返回blank。如果你要避免上下文轉(zhuǎn)換,你需要把度量值的代碼展開寫,就像下面這個樣子:

[SalesMoreThanAverage] :=
SUMX (
Customer,
IF (
[SumOfSalesAmount] > AVERAGEX ( Customer, [SumOfSalesAmount]
),
[SumOfSalesAmount]
))

把度量值的代碼展開寫以后,salesmorethanaverage返回了正確的結(jié)果。另外,還有一個值得提醒的地方是,這里對customer有兩個內(nèi)嵌的行上下文,以及三個度量值。第一個當前的客戶銷售額,sumx,另外一個averagex迭代的銷售額。

后面的章節(jié)里面我們會大量使用這種拓展寫法,用來解決一些特殊的場景。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容