執行上下文轉換
在行上下文中計算度量或度量表達式時會發生什麼? 這種情況可能會發生在計算列公式中或計算迭代器函數中的表達式時。
在以下範例中,您將向 客戶 表格新增一個計算列,以將客戶分類為忠誠度類別。 場景很簡單:當客戶產生的收入小於$2500 時,客戶被歸類為 低;否則,它們將被歸類為 高。
Customer Segment =
VAR CustomerRevenue = SUM(Sales[Sales Amount])
RETURN
IF(CustomerRevenue < 2500, "Low", "High")
在報表的 第 4 頁 上,新增 客戶細分 列作為圓餅圖的圖例。
請注意,僅存在一個 客戶細分 值。 原因是計算列公式產生了不正確的結果:每個客戶都被分配了值 High ,因為表達式 SUM(Sales[Sales Amount])
未在過濾器上下文。 因此,每個客戶都會根據 每個銷售金額 列值在 銷售 表的總和進行評估。
要強制對每個客戶 SUM(Sales[Sales Amount])
表達式 求值,必須進行上下文轉換,將行上下文列值應用於篩選上下文。 您可以使用 CALCULATE
函數來完成此轉換,而無需傳入過濾表達式。
修改計算的欄定義,使其產生正確的結果。
Customer Segment =
VAR CustomerRevenue = CALCULATE(SUM(Sales[Sales Amount]))
RETURN
IF(CustomerRevenue < 2500, "Low", "High")
在圓餅圖視覺效果中,將新的計算列新增到圖例池中,驗證現在是否顯示兩個圓餅圖段。
在這種情況下, CALCULATE
函數將行上下文值用作過濾器,稱為 上下文轉換。 準確地說,當表上有唯一列時,該過程就不會完全按照這種方式工作。 當表中存在唯一列時,您只需對該列套用篩選器即可進行轉換。 在本例中, Power BI 在 CustomerKey 列上套用篩選器以取得行上下文中的值。
如果您在行上下文中計算的表達式中引用度量,則上下文轉換是自動的。 因此,您不需要將度量參考傳遞給 CALCULATE
函數。
修改計算的欄定義(它引用 收入 度量),並注意它繼續產生正確的結果。
Customer Segment =
VAR CustomerRevenue = [Revenue]
RETURN
IF(CustomerRevenue < 2500, "Low", "High")
現在,您可以完成 銷售佣金 衡量公式。 要產生總計,您需要使用迭代器函數來迭代篩選器上下文中的所有區域。 迭代器函數表達式必須使用 CALCULATE
函數將行上下文轉換為過濾器上下文。 請注意,它不再需要測試 Sales Territory 表中的單一 Country 列值是否在過濾器中上下文,因為已知它是由單一國家/地區進行過濾的(因為它會迭代過濾器上下文中的區域,並且一個區域僅屬於一個國家/地區)。
切換到報表的 第 3 頁 ,然後修改 銷售佣金 度量定義以使用 SUMX
迭代器函數:
Sales Commission =
SUMX(
VALUES('Sales Territory'[Region]),
CALCULATE(
[Revenue]
* IF(
VALUES('Sales Territory'[Country]) = "United States",
0.15,
0.1
)
)
)
表格視覺效果現在顯示所有區域的銷售佣金總額。