共用方式為


CALCULATE

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

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

注意

還有 CALCULATETABLE 函式。 除了修改套用至傳回 數據表對象的表示式 篩選內容之外,它會執行完全相同的功能。

語法

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

參數

術語 定義
expression 要評估的表達式。
filter1, filter2,… (選擇性)定義篩選條件或篩選修飾詞函式的布爾表達式或數據表表達式。

做為第一個參數的表達式基本上與量值相同。

篩選可以是:

  • 布爾篩選表達式
  • 數據表篩選表達式
  • 篩選修改函式

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

布爾篩選表達式

布爾表達式篩選條件是評估為 TRUEFALSE的表達式。 他們必須遵守數個規則:

  • 他們可以從單一數據表參考數據行。
  • 它們無法參考量值。
  • 它們無法使用巢狀 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 1ALLEXCEPTALLNOBLANKROW 從一或多個數據行移除篩選,或從單一數據表的所有數據行中移除篩選。
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])
    )
)

函式會將 sales 數據表 總和 Sales Amount 數據行值(在篩選內容中)除以修改篩選內容中的相同表達式。 這是使用篩選修飾詞函式 REMOVEFILTERS 函式來修改篩選內容的 CALCULATE 函式。 它會從 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 數據行除外。

篩選內容數據列內容CALCULATETABLE 函式篩選函式