CALCULATE

適用於:導出數據行計算數據表Measure視覺計算

評估修改 filter 內容中的表達式。

注意

還有 CALCULATETABLE 函式。 它會執行完全相同的功能,except 它會修改套用至傳回 數據表物件表達式的 filter 內容

語法

DAX
CALCULATE(<expression>[, <filter1> [, <filter2> [, …]]])

參數

術語 定義
expression 要評估的表達式。
filter1, filter2,… (選擇性)布爾表達式 or 定義 filtersorfilter 修飾詞函式的數據表運算式。

用來作為 first 參數的表達式基本上與 measure相同。

Filters 可以是:

  • 布爾值 filter 表達式
  • 數據表 filter 表示式
  • Filter 修改函式

當有多個 filters時,可以使用 AND(&&邏輯運算符進行評估,這表示 all 條件必須 TRUE,orOR(||)邏輯運算符,這表示任一條件都可以 true。

布爾值 filter 表達式

布爾表達式 filter 是評估為 TRUEorFALSE的表達式。 他們必須遵守數個規則:

  • 他們可以從單一數據表參考數據行。
  • 它們無法參考量值。
  • 它們無法使用巢狀 CALCULATE 函式。

從 2021 年 9 月版的 Power BI Desktop 開始,下列專案也適用於:

  • 除非它們以自變數的形式傳遞至聚合函數,否則它們無法使用掃描 or 傳回數據表的函式。
  • 它們 可以 包含傳回純量 value的聚合函數。 例如
    DAX
    Total sales on the last selected date =
    CALCULATE (
        SUM ( Sales[Sales Amount] ),
        'Sales'[OrderDateKey] = MAX ( 'Sales'[OrderDateKey] )
    )
    

數據表 filter 表示式

數據表表達式 filter 會將數據表物件套用為 filter。 它可以是模型數據表的參考,但更有可能是傳回數據表物件的函式。 您可以使用 FILTER 函式來套用複雜的 filter 條件,包括布爾值 filter 表示式無法定義的條件。

Filter 修飾詞函式

Filter 修飾詞函式可讓您執行更多動作,而不只是新增 filters。 它們提供您在修改 filter 內容時的額外控制項。

功能 目的
REMOVEFILTERS 從單一數據表的一個 all 數據行中移除 allfilters,orfilters 從一個數據表 or 多個數據行中移除 or。
ALL 1ALLEXCEPTALLNOBLANKROW 從一個 or 多個數據行中移除 filters,or 從單一數據表的 all 數據行中移除。
KEEPFILTERS 新增 filter,而不移除相同數據行上的現有 filters。
USERELATIONSHIP 參與 related 數據行之間的非作用中關聯性,在此情況下,作用中關聯性會自動變成非作用中。
CROSSFILTER 修改 filter 方向(從兩者到單一,or 從單一到兩者)or 停用關聯性。

1ALL 函式 and 其變體的行為,and 做為傳回數據表物件的函式 filter 修飾詞。 If 工具支援 REMOVEFILTERS 函式,最好使用它來移除 filters。

傳回 value

表達式結果的 value。

言論

  • 提供 filter 表示式時,CALCULATE 函式會將 filter 內容修改為 evaluate 表達式。 針對每個 filter 表示式,當 filter 表示式 not 包裝在 KEEPFILTERS 函式中時,會有兩個可能的標準結果:

    • If 數據行(or 數據表)不在 filter 內容中,則會將新的 filters 新增至 filter 內容,以 evaluate 表達式。
    • If 數據行(or 數據表)已經位於 filter 內容中,新的 filters 將會覆寫現有的 filters,以 evaluateCALCULATE 表達式。
  • 不使用 使用的 函式可達成特定需求。 它會將數據列內容轉換為 filter 內容。 當匯總模型數據的表達式(not 模型 measure)必須在數據列內容中進行評估時需要用到。 評估反覆運算器函式中的運算式時,此案例可能發生在計算結果列公式中 or。 請注意,當模型 measure 用於數據列內容時,內容轉換是自動的。

  • 在匯出數據行中使用 or 數據列層級安全性 (RLS) 規則時,支援此函式 not 用於 DirectQuery 模式。

例子

下列 Sales 數據表 measure 定義會產生營收結果,但僅適用於色彩為藍色的產品。

本文中的範例可以搭配 sample Adventure Works DW 2020 Power BI Desktop 模型使用。 若要取得模型,請參閱 DAXsample 模型

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 函式會評估已修改 filter 內容中 Sales 數據表 Sales Amount 資料行的 sum。 新的 filter 會新增至 Product 資料表 Color 數據行,or,filter 會覆寫已套用至數據行的任何 filter。

下列 Sales 數據表 measure 定義會產生銷售 all 銷售管道銷售額的比率。

管道 銷售金額 總頻道收入 %
互聯網 $29,358,677.22 26.74%
轉銷商 $80,450,596.98 73.26%
總計 $109,809,274.20 100.00%
DAX
Revenue % Total Channel =
DIVIDE(
    SUM(Sales[Sales Amount]),
    CALCULATE(
        SUM(Sales[Sales Amount]),
        REMOVEFILTERS('Sales Order'[Channel])
    )
)

DIVIDE 函式會將 Sales 數據表的總和 Sales Amount 資料行 value(在 filter 內容中)除以修改 filter 內容中的相同表達式。 這是使用 REMOVEFILTERS 函式來修改 filter 內容的 CALCULATE 函式,這是 filter 修飾詞函式。 它會從 Sales Order 數據表 Channel 數據行中移除 filters。

下列 Customer 數據表匯出數據行定義會將客戶分類為忠誠類別。 這是一個非常簡單的案例:當客戶產生的收入低於 2500 美元時,它們會分類為 Low;否則會 High

DAX
Customer Segment =
IF(
    CALCULATE(SUM(Sales[Sales Amount]), ALLEXCEPT(Customer, Customer[CustomerKey])) < 2500,
    "Low",
    "High"
)

在此範例中,數據列內容會轉換成 filter 內容。 它稱為 內容轉換 函式會從 Customer 數據表數據行 customerKey 數據行移除

Filter 內容
數據列內容
CALCULATETABLE 函式
Filter 函式