2024-06-13 變量

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ì)解釋:
  1. 變量定義與存儲
    使用VAR關(guān)鍵字定義的變量,其值在定義時就被計算并存儲下來。
    這個值是在定義變量時的上下文環(huán)境中計算得到的,一旦確定,該值在后續(xù)的使用中不會改變。
  2. 內(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)。
  3. 示例
    假設(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值。

  1. 總結(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)前的篩選上下文。

如果外部有一個篩選器(比如性別篩選器),這個篩選器會影響所有度量值的計算,除非在度量值的定義中明確地使用ALLALLSELECTED、REMOVEFILTERS或其他函數(shù)來忽略或修改篩選上下文。

在例子中,b度量值會首先計算a(即2024年6月14日之前的總金額),但在計算b時,由于它包含了[大區(qū)]="華南"的篩選條件,并且沒有使用任何函數(shù)來忽略或修改外部篩選器(如性別篩選器),因此b的計算會同時受到[大區(qū)]="華南"和外部性別篩選器的影響。

換句話說,如果外部篩選器設(shè)置為某個特定的性別,那么b的計算將只包括那些屬于“華南”大區(qū)、滿足性別篩選條件、且在2024年6月14日之前的金額。

如果希望b的計算不受外部性別篩選器的影響,可以在CALCULATE函數(shù)內(nèi)部使用ALLALLSELECTED函數(shù)來移除或忽略性別篩選器,例如:

b = VAR bb = CALCULATE(a, [大區(qū)]="華南", ALL(salse[性別])) RETURN bb

這樣,無論外部性別篩選器如何設(shè)置,b的計算都將只受到[大區(qū)]="華南"[時間]<DATE(2024, 6, 14)這兩個條件的限制。

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

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

  • 深入DAX計算和可視化原理來解釋“上下文”的概念時,我們可以從以下幾個方面進(jìn)行分點表示和歸納: 一、DAX計算的核...
    不懂不問閱讀 168評論 0 1
  • 至此,您已經(jīng)有了扎實的DAX理論知識,現(xiàn)在是時候開始使用DAX解決一些有趣的場景了。在本章中,我們將展示DAX使用...
    BI_Jay閱讀 4,146評論 0 6
  • 在本章中,我們將繼續(xù)探索DAX語言的強大,并詳細(xì)解釋單個函數(shù):CALCULATE。實際上,相同的注意事項對于CAL...
    BI_Jay閱讀 8,998評論 1 19
  • 現(xiàn)在,您已經(jīng)學(xué)習(xí)了DAX語言的基礎(chǔ)知識。您知道如何創(chuàng)建計算列和度量值,并且您對DAX中的常用函數(shù)有很好的理解。本章...
    BI_Jay閱讀 3,825評論 0 11
  • 在快速介紹上一章之后,現(xiàn)在是時候開始討論DAX語言了。在本章中,您將學(xué)習(xí)語言的語法、計算列和度量值(在Excel術(shù)...
    BI_Jay閱讀 3,553評論 0 9

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