評估已修改篩選內容中的表達式。
注意
還有 CALCULATETABLE 函式。 除了修改套用至傳回
語法
CALCULATE(<expression>[, <filter1> [, <filter2> [, …]]])
參數
| 術語 | 定義 |
|---|---|
expression |
要評估的表達式。 |
filter1, filter2,… |
(選擇性)定義篩選條件或篩選修飾詞函式的布爾表達式或數據表表達式。 |
做為第一個參數的表達式基本上與量值相同。
篩選可以是:
- 布爾篩選表達式
- 數據表篩選表達式
- 篩選修改函式
當有多個篩選條件時,可以使用 AND(&&)邏輯運算符進行評估,這表示所有條件都必須 TRUE,或 OR (||) 邏輯運算符,這表示任一條件都可以是 true。
布爾篩選表達式
布爾表達式篩選條件是評估為 TRUE 或 FALSE的表達式。 他們必須遵守數個規則:
- 他們可以從單一數據表參考數據行。
- 它們無法參考量值。
- 它們無法使用巢狀 CALCULATE 函式。
從 Power BI Desktop 的 2021 年 9 月版本開始,下列專案也適用於:
- 除非它們當做自變數傳遞至聚合函數,否則它們無法使用掃描或傳回數據表的函式。
- 它們 可以 包含傳回純量值的聚合函數。 例如
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 模式中使用此函式。
例子
下列 Sales 數據表量值定義會產生收益結果,但僅適用於色彩為藍色的產品。
本文中的範例可以搭配範例 Adventure Works DW 2020 Power BI Desktop 模型使用。 若要取得模型,請參閱 DAX 範例模型。
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 數據表量值定義會產生所有銷售通路銷售額的比率。
| 管道 | 銷售金額 | 總頻道收入 % |
|---|---|---|
| 網際網路 | $29,358,677.22 | 26.74% |
| 轉銷商 | $80,450,596.98 | 73.26% |
| 總計 | $109,809,274.20 | 100.00% |
Revenue % Total Channel =
DIVIDE(
SUM(Sales[Sales Amount]),
CALCULATE(
SUM(Sales[Sales Amount]),
REMOVEFILTERS('Sales Order'[Channel])
)
)
下列 Customer 數據表匯出數據行定義會將客戶分類為忠誠類別。 這是一個非常簡單的案例:當客戶產生的收入低於 2500 美元時,它們會分類為 Low;否則會 High。
Customer Segment =
IF(
CALCULATE(SUM(Sales[Sales Amount]), ALLEXCEPT(Customer, Customer[CustomerKey])) < 2500,
"Low",
"High"
)
在此範例中,數據列內容會轉換成篩選內容。 它稱為 內容轉換。 ALLEXCEPT 函式會移除所有 Customer 數據表數據行的篩選,但 CustomerKey 數據行除外。