CALCULATE
評估已修改篩選內容中的表達式。
注意
還有 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 數據行除外。