DAX中變量的定義
- 定義:在DAX中,變量通過VAR關(guān)鍵字進(jìn)行定義,并用于存儲表達(dá)式的值。變量在定義之后,可以在后續(xù)的計算中作為參數(shù)或引用。
格式:
- 使用原則:
變量名不能使用中文名。
變量可以是一個度量值,也可以是一張表(但在實際使用中,變量通常用于存儲單個值或簡單計算的結(jié)果)。
變量定義后無法修改(即一旦定義了變量的值,在后續(xù)的計算中不能更改這個值)。
變量需要先定義后使用。
變量的執(zhí)行邏輯
定義階段:使用VAR關(guān)鍵字和表達(dá)式定義一個變量,并為其分配一個值。- 作用域:
如果變量定義在VAR...RETURN結(jié)構(gòu)中,則其作用域限制在該結(jié)構(gòu)內(nèi)部。
如果變量定義在更高級別的公式或查詢中,則其作用域可能更廣。- 計算時機:
變量在定義時不會立即計算,而是等到在后續(xù)表達(dá)式中被引用時才會進(jìn)行計算。
未被引用的變量不會被計算,這有助于提高查詢效率。- 上下文:
變量的上下文由定義時的上下文決定,與使用時的上下文無關(guān)。
如果需要可修改的上下文,建議使用度量值(measure)而不是變量。
變量的原理- 存儲機制:變量在DAX中作為一個存儲數(shù)據(jù)的機制,用于存儲表達(dá)式的計算結(jié)果。這些結(jié)果被存儲在內(nèi)存中,供后續(xù)的表達(dá)式引用。
性能優(yōu)化:通過使用變量,可以避免在多個地方重復(fù)計算相同的表達(dá)式,從而提高查詢性能。- 代碼清晰性:將復(fù)雜的計算過程分解為多個簡單的步驟,并使用變量存儲中間結(jié)果,可以使代碼更加清晰和易于維護(hù)。
示例
以下是一個使用VAR定義變量并計算總利潤的示例:
dax
TotalProfit =
VAR SalesAmount = SUM('Sales'[Amount]); // 定義銷售額變量
VAR Cost = SUM('Sales'[Cost]); // 定義成本變量
RETURN SalesAmount - Cost; // 返回銷售額與成本的差值,即總利潤
在這個示例中,我們首先使用VAR定義了兩個變量SalesAmount和Cost,分別用于存儲銷售額和成本的總和。然后,我們使用RETURN語句返回這兩個變量的差值,即總利潤。通過使用變量,我們可以將復(fù)雜的計算過程分解為幾個簡單的步驟,并使代碼更加清晰和易于理解。
- 在DAX中,外部上下文不會直接影響已經(jīng)定義的變量的值。以下是關(guān)于DAX中變量與外部上下文關(guān)系的詳細(xì)解釋:
變量的定義與值:
使用VAR關(guān)鍵字定義的變量,其值在定義時就被計算并存儲下來。
這個值是在定義變量時的上下文環(huán)境中計算得到的,一旦確定,就不會改變。
外部上下文:
在DAX中,外部上下文通常指的是查詢、行上下文、篩選上下文等。
這些上下文會影響DAX表達(dá)式的計算結(jié)果,但不會直接影響已經(jīng)定義的變量的值。
變量與外部上下文的關(guān)系:
變量的值是在定義時確定的,與后續(xù)使用的上下文無關(guān)。
當(dāng)變量在后續(xù)的表達(dá)式中被引用時,其值會被取出并使用,而不會重新計算。
即使外部上下文發(fā)生了變化,已經(jīng)定義的變量的值也不會隨之改變。
示例:
假設(shè)我們有一個度量值,其中定義了一個變量來存儲某個值,如:
dax
MyMeasure =
VAR MyVar = SUM('Sales'[Amount])
RETURN MyVar
在這個例子中,MyVar的值是在度量值MyMeasure被計算時確定的,具體地說是基于Sales表中Amount列的總和。無論后續(xù)查詢的篩選條件如何變化,MyVar的值都是固定的,不會隨著篩選條件的變化而改變。
總結(jié):
在DAX中,變量的值是在定義時確定的,并且與外部上下文無關(guān)。
當(dāng)變量在后續(xù)的表達(dá)式中被引用時,其值會被直接使用,而不是重新計算。
如果需要基于不同的上下文環(huán)境計算不同的值,應(yīng)該使用度量值而不是變量。度量值會根據(jù)當(dāng)前的上下文環(huán)境重新計算其值。
- 在DAX中,內(nèi)部上下文通常指的是行上下文和篩選上下文,它們確實會影響變量的計算方式,但不會影響已存儲的變量值本身。以下是關(guān)于DAX中變量與內(nèi)部上下文關(guān)系的詳細(xì)解釋:
- 變量定義與存儲
使用VAR關(guān)鍵字定義的變量,其值在定義時就被計算并存儲下來。
這個值是在定義變量時的上下文環(huán)境中計算得到的,一旦確定,該值在后續(xù)的使用中不會改變。 - 內(nèi)部上下文對變量的影響
a. 行上下文(Row Context)
行上下文是DAX在處理表格數(shù)據(jù)時的一種上下文,它代表了當(dāng)前正在處理的行。
然而,行上下文不會影響已經(jīng)定義的變量的值。變量值是在定義時確定的,與后續(xù)的行上下文無關(guān)。
b. 篩選上下文(Filter Context)
篩選上下文是通過在查詢或度量值中應(yīng)用的篩選器來創(chuàng)建的,它限定了DAX表達(dá)式中數(shù)據(jù)的范圍。
篩選上下文會影響在VAR表達(dá)式中使用的任何聚合函數(shù)或計算。這是因為這些函數(shù)和計算會根據(jù)當(dāng)前的篩選上下文來執(zhí)行。
但篩選上下文不會改變已經(jīng)定義的變量的值。變量值是在定義時確定的,與后續(xù)的篩選上下文無關(guān)。 - 示例
假設(shè)我們有一個度量值,其中定義了一個變量來存儲某個篩選后的總和:
dax
FilteredTotalSales =
VAR SalesInYear = SUMX(FILTER(Sales, Sales[Year] = 2023), Sales[Amount])
RETURN SalesInYear
在這個例子中,SalesInYear變量是通過SUMX和FILTER函數(shù)計算得到的,它表示2023年的銷售總額。這個值是在度量值FilteredTotalSales被計算時確定的,并且是基于Sales[Year] = 2023這個篩選條件。
如果后續(xù)查詢或報表中的篩選條件發(fā)生了變化(例如,改為篩選2024年的數(shù)據(jù)),F(xiàn)ilteredTotalSales度量值會重新計算,但這不會改變SalesInYear變量在之前計算中得到的值。相反,它會根據(jù)新的篩選條件重新計算一個新的SalesInYear值。
- 總結(jié)
在DAX中,內(nèi)部上下文(行上下文和篩選上下文)會影響在VAR表達(dá)式中使用的聚合函數(shù)和計算,但不會影響已存儲的變量值本身。
變量值是在定義時確定的,與后續(xù)的內(nèi)部上下文無關(guān)。
如果需要根據(jù)不同的上下文環(huán)境計算不同的值,應(yīng)該使用度量值而不是變量,因為度量值會根據(jù)當(dāng)前的上下文環(huán)境重新計算其值。
實列:
比如有一張表salse,存在金額、大區(qū)、姓名、性別、時間等列a=calculate(sum([金額]),[時間]<date(2024,6,14)),
b=var bb=calculate(a,[大區(qū)]="華南")
return b
在DAX中,當(dāng)定義一個度量值(measure)或計算列(calculated column),并且這個度量值或計算列中嵌套了其他計算或度量值時,嵌套的計算會受到外部篩選上下文(filter context)的影響,包括切片器、過濾器、行上下文等。
例子:
a = CALCULATE(SUM([金額]), [時間] < DATE(2024, 6, 14))
b = VAR bb = CALCULATE(a, [大區(qū)]="華南") RETURN bb
度量值b使用了CALCULATE函數(shù),并嵌套了另一個度量值a。這里的重點是CALCULATE函數(shù)會考慮當(dāng)前的篩選上下文。
如果外部有一個篩選器(比如性別篩選器),這個篩選器會影響所有度量值的計算,除非在度量值的定義中明確地使用ALL、ALLSELECTED、REMOVEFILTERS或其他函數(shù)來忽略或修改篩選上下文。
在例子中,b度量值會首先計算a(即2024年6月14日之前的總金額),但在計算b時,由于它包含了[大區(qū)]="華南"的篩選條件,并且沒有使用任何函數(shù)來忽略或修改外部篩選器(如性別篩選器),因此b的計算會同時受到[大區(qū)]="華南"和外部性別篩選器的影響。
換句話說,如果外部篩選器設(shè)置為某個特定的性別,那么b的計算將只包括那些屬于“華南”大區(qū)、滿足性別篩選條件、且在2024年6月14日之前的金額。
如果希望b的計算不受外部性別篩選器的影響,可以在CALCULATE函數(shù)內(nèi)部使用ALL或ALLSELECTED函數(shù)來移除或忽略性別篩選器,例如:
b = VAR bb = CALCULATE(a, [大區(qū)]="華南", ALL(salse[性別])) RETURN bb
這樣,無論外部性別篩選器如何設(shè)置,b的計算都將只受到[大區(qū)]="華南"和[時間]<DATE(2024, 6, 14)這兩個條件的限制。