CALCULATE

適用於:匯出數據行計算數據表量值視覺計算

評估已修改篩選內容中的表達式。

注意

還有 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%

函式會將 sales 數據表 總和 Sales Amount 數據行值(在篩選內容中)除以修改篩選內容中的相同表達式。 這是使用篩選修飾詞函式 CALCULATE 函式來修改篩選內容的 REMOVEFILTERS 函式。 它會從 Sales Order 數據表 Channel 數據行中移除篩選。

下列 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 數據行除外。