淺談DAX中的上下文概念

在學習DAX語言中,幾乎無時無刻都會碰到上下文(Context)這一概念概念,很多函數的解釋說明中都會特別強調它會受到何種類型上下文影響,是否當前上下文關係對其起作用,以及該函數是否能改變另一個被當做參數函數的上下文等。可以說,如果不知道DAX中的上下文是什麼,基本就無法掌握DAX語言。

其實上下文概念並不深奧,但是對於習慣使用Excel計算函數的親們來說在學習這塊知識時感覺會比較彆扭,這主要是因爲在Excel中,某一段計算內容的確定是通過Excel表格中的座標來確定的,非常直觀,例如SUM(A1:A3),能讓人一眼就明白要計算的內容是A1單元格到A3單元格之間所有數字的總和。而在DAX中,爲了支持對大數據進行多樣化的運算,它沒有使用Excel中通過固定座標定義函數運算範圍的方式,轉而通過上下文概念來定義函數所在的環境變量,即其運算範圍,實現了函數對數據的處理可以根據上下文的不同而輸出不同的運算結果。因此,只有充分理解了上下文含義才能更好的使用DAX來分析數據。

DAX中有兩種類型的上下文分:行上下文(Row Context)和篩選上下文(Filter Context)。

行上下文

行上下文可以理解爲當前行內容。例如下圖中要求每個產品的利潤,可以創建一個計算列Profit利用下面公式獲得。

在這裏插入圖片描述

Profit =
'Product'[Price] - 'Product'[Cost]

Profit計算列中的每個值,都是由其所在行的Price值減去Cost值獲得的。這其中,每一行內的Price值和Cost值就是確定當前行Profit值的上下文。

行上下文的應用範圍不只侷限於當前一張表。如果兩張表之間建立了關聯關係,則通過該關聯關係就形成一個跨表的行上下文。例如下面的Product表和SalesInfo表通過Product列建立了一個一對多的關聯關係。當在SalesInfo表中要獲取每種商品的銷售額時,就可以利用表單之間的關聯關係,通過行上下文的概念在找到Product表中找到每種商品對應的價格來進行計算。
在這裏插入圖片描述

篩選上下文

篩選上下文是指將原始數據按照一定規則進行篩選,然後將提取出來的結果再作爲環境變量帶入到函數中使用。通過設定篩選上下文,可以靈活的改變函數的運算範圍,實現數據分類分析處理的目的。例如對上面表單的數據,可以將Total_Sales改寫爲下面形式來只計算Country是Australia的銷售額。

Total_Sales =
SUMX (
    FILTER ( SalesInfo, SalesInfo[Country] = "Australia" ),
    SalesInfo[Product_Sales]
)

在這裏插入圖片描述
計算Australia銷售總額的Total_Sales計算列中調用了一個FILTER函數,目的是生成一個只包含Country是Australia相關數據的子表單。SalesInfo[Country] = "Australia"即是篩選上下文條件,將函數SUMX的計算範圍從原始數據中的所有Country變成只針對Australia進行計算。

篩選上下文在矩陣表中的應用最爲明顯。例如創建一個度量值TotalSales_Measure來計算銷售總和,之後在報表頁面創建一個矩陣表,選擇使用Country做行,Product做列,TotalSales_Measure做值,再將矩陣表展開就可以得到下面的數據結果。
在這裏插入圖片描述
矩陣表中清晰的顯示了每個國家的產品銷售總額,以及每種產品在每個國家內的銷售額。之所以能得到這樣的結果是因爲矩陣表中的行Country和列Product是篩選上下文的條件,能限制度量值TotalSales_Measure中SUM函數的運算範圍。例如,當矩陣表中行值是Australia,列值是Pillows時就會形成一個Country=Australia,Product=Pillows的篩選條件,原始數據會被該篩選條件進行過濾,所有符合條件的數據會組成一個子表單,之後SUM函數會在該子表單上來計算銷售額。

需要記住的是,DAX的行上下文和篩選上下文共同作用於函數運算當中並對其結果產生影響。在分析行上下文對函數結果的影響時要以當前行中的數據爲研究基準,而分析篩選上下文對函數結果的影響時則要從篩選出的子表單入手進行。
當創建計算列時,DAX會自動爲其定義行上下文關係,即計算列中的每個值都受到其所在行數據的影響。而當使用度量值創建報表時,其運算都是基於表單中其他條件生成的篩選上下文而進行的。

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