評估已修改篩選內容中的表達式。
注意
還有 CALCULATETABLE 函式。 除了修改套用至傳回
語法
CALCULATE(<expression>[, <filter1> [, <filter2> [, …]]])
參數
| 術語 | 定義 |
|---|---|
expression |
要評估的運算式。 |
filter1, filter2,… |
(選擇性)定義篩選條件或篩選修飾詞函式的布爾表達式或數據表表達式。 |
你用來作為第一個參數的表達式就像一個測度。
篩選可以是:
- 布爾篩選表達式
- 數據表篩選表達式
- 篩選修改函式
當你使用多個濾波器時,可以用 (&&) 邏輯運算子來評估它們AND,表示所有條件都必須是 TRUE,或用 OR (||) 邏輯運算子來計算,這表示任一條件都可能為真。 欲了解更多資訊,請參見 DAX 運算子邏輯 > 運算子。
布爾篩選表達式
布爾表達式篩選條件是評估為 TRUE 或 FALSE的表達式。 必須遵守幾項規則:
它可以參考單一資料表的欄位。
它無法參考度量。
它不能使用巢 CALCULATE 狀函式。
它無法使用掃描或回傳資料表的函式,除非你把它們當作聚合函式的參數。
它可以包含一個彙總函數,回傳一個純量值。 例如:
Total sales on the last selected date = CALCULATE ( SUM ( Sales[Sales Amount] ), 'Sales'[OrderDateKey] = MAX ( 'Sales'[OrderDateKey] ) )
數據表篩選表達式
數據表表達式篩選條件會將數據表物件套用為篩選。 它可以是模型數據表的參考,但更有可能是傳回數據表物件的函式。 你可以用這個 FILTER 函式套用複雜的濾波條件,包括那些布林濾子表達式無法定義的條件。
篩選修飾詞函式
過濾修改器功能讓你做的不只是新增篩選器。 它們在修改濾鏡上下文時能給你額外的控制權。
| 功能 | 目的 |
|---|---|
| REMOVEFILTERS | 從數據表的一或多個數據行,或從單一數據表的所有數據行中移除所有篩選或篩選。 |
| ALL 1、 ALLEXCEPT、 ALLNOBLANKROW | 從一或多個數據行移除篩選,或從單一數據表的所有數據行中移除篩選。 |
| KEEPFILTERS | 新增篩選,而不移除相同數據行上的現有篩選。 |
| USERELATIONSHIP | 若在相關欄位間建立非活躍關係,則該活躍關係自動變成非活躍狀態。 |
| CROSSFILTER | 修改篩選方向(從兩者到單一,或從單一到兩者)或停用關聯性。 |
1ALL 函式及其變體會同時做為篩選修飾詞和傳回數據表物件的函式。 如果你的工具支援這個 REMOVEFILTERS 功能,可以用它來移除過濾器。
傳回值
由該表達式產生的數值。
言論
當你提供濾嘴表達式時,函 CALCULATE 式會修改濾波器上下文來評估表達式。 對於每個濾波器表達式,當該濾波器表達式未被函式包裹時 KEEPFILTERS ,存在兩個標準結果:
- 如果欄位或資料表不在篩選條件中,則會新增篩選條件以評估表達式。
- 如果欄位或資料表已經在篩選條件中,現有的篩選器會被新的篩選器覆蓋以評估表達式 CALCULATE 。
使用CALCULATE無濾條件的函數可達成特定需求。 它會轉換數據列內容以篩選內容。 當需要在列上下文中評估一個總結模型資料的表達式(非模型指標)時,此轉換是必要的。 此案例可能發生在計算結果列公式中,或在評估反覆運算器函式中的運算式時發生。 當你在列上下文中使用模型度量時,上下文轉換是自動發生的。
-
在匯出數據行或數據列層級安全性 (RLS) 規則中使用時,不支援在 DirectQuery 模式中使用此函式。
例子
本文中的範例可以搭配範例 Adventure Works DW 2020 Power BI Desktop 模型使用。 若要取得模型,請參閱 DAX 範例模型。
下列 Sales 數據表量值定義會產生收益結果,但僅適用於色彩為藍色的產品。
Blue Revenue =
CALCULATE ( SUM ( Sales[Sales Amount] ), 'Product'[Color] = "Blue" )
| 類別 | 銷售金額 | 藍色營收 |
|---|---|---|
| 輔料 | $1,272,057.89 | $165,406.62 |
| 自行車 | $94,620,526.21 | $8,374,313.88 |
| 服裝 | $2,117,613.45 | $259,488.37 |
| 元件 | $11,799,076.66 | $803,642.10 |
| 總計 | $109,809,274.20 | $9,602,850.97 |
CALCULATE 函式會評估已修改篩選內容中 Sales 數據表 Sales Amount 數據行的總和。 新的篩選條件會新增至 Product 數據表,Color 數據行;或者,篩選條件會覆寫已套用至數據行的任何篩選。
下列 Sales 數據表量值定義會產生所有銷售通路銷售額的比率。
Revenue % Total Channel =
DIVIDE (
SUM ( Sales[Sales Amount] ),
CALCULATE (
SUM ( Sales[Sales Amount] ),
REMOVEFILTERS ( 'Sales Order'[Channel] )
)
)
| 管道 | 銷售金額 | 總頻道收入 % |
|---|---|---|
| 網際網路 | $29,358,677.22 | 26.74% |
| 轉銷商 | $80,450,596.98 | 73.26% |
| 總計 | $109,809,274.20 | 100.00% |
下列 Customer 數據表匯出數據行定義會將客戶分類為忠誠類別。 這是一個非常簡單的案例:當客戶產生的收入低於 2500 美元時,它們會分類為 Low;否則會 High。
Customer Segment =
IF (
CALCULATE (
SUM ( Sales[Sales Amount] ),
ALLEXCEPT ( Customer, Customer[CustomerKey] )
) < 2500,
"Low",
"High"
)
| 客戶群 | 客戶數量 | 銷售金額 |
|---|---|---|
| 高 | 4,637 | $102,670,663.09 |
| 低 | 13,848 | 7,138,611.11美元 |
| 總計 | 18,485 | $109,809,274.20 |
在此範例中,數據列內容會轉換成篩選內容。 它稱為 內容轉換。 ALLEXCEPT 函式會移除所有 Customer 數據表數據行的篩選,但 CustomerKey 數據行除外。