計算
評估已修改篩選內容中的運算式。
注意
另外還有 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 | 修改篩選條件方向 (從兩者到單一,或是從單一到兩者) 或停用關聯性。 |
1 ALL 函式及其變體,會同時作為篩選條件修飾詞和傳回資料表物件的函式。 如果您的工具支援 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 |
Bikes | $94,620,526.21 | $8,374,313.88 |
Clothing | $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% |
Reseller | $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])
)
)
DIVIDE 函式會將運算式的 Sales 資料表 Sales Amount 資料行值 (在篩選條件內容中) 總和除以已修改篩選條件內容中的相同運算式。 這是 CALCULATE 函式,藉由使用 REMOVEFILTERS 函式 (篩選條件修飾詞函式) 來修改篩選條件內容。 其會從 Sales Order 資料表 Channel 資料行移除篩選條件。
下列 Customer 資料表計算結果資料行定義會將客戶分類至忠誠度類別。 這是非常簡單的案例:當客戶產生的收益小於 $2500 時,這些客戶會分類為低;否則會分類為高。
Customer Segment =
IF(
CALCULATE(SUM(Sales[Sales Amount]), ALLEXCEPT(Customer, Customer[CustomerKey])) < 2500,
"Low",
"High"
)
在此範例中,資料列內容會轉換成篩選條件內容。 這就是所謂的內容轉換。 ALLEXCEPT 函式會從所有 Customer 資料表資料行 (CustomerKey 資料行除外) 移除篩選條件。