CALCULATE

変更されたフィルター コンテキストでテーブル式を評価します。

注意

CALCULATETABLE 関数もあります。 "テーブル オブジェクト" を返す式に適用されるフィルター コンテキストを変更することを除き、まったく同じ機能を実行します。

構文

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

パラメーター

用語 定義
expression 評価される式。
filter1, filter2,… (省略可能) フィルターを定義するブール式またはテーブル式、あるいはフィルター変更関数。

第 1 パラメーターとして使用される式は、基本的にメジャーと同じです。

フィルターには以下を指定できます。

  • ブール型フィルター式
  • テーブル フィルター式
  • フィルター変更関数

複数のフィルターがある場合は、すべての条件が TRUE でなければならない AND (&&) 論理演算子か、どちらかの条件を TRUE にできる OR (||) 論理演算子を使用して評価できます。

ブール型フィルター式

ブール式フィルターとは、TRUE または FALSE に評価される式です。 遵守する必要がある規則がいくつかあります。

  • 1 つのテーブルから列を参照できます。
  • メジャーを参照することはできません。
  • 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 テーブルの 1 つ以上の列から、または 1 つのテーブルのすべての列から、すべてのフィルターまたはいくつかのフィルターを削除します。
ALL1ALLEXCEPTALLNOBLANKROW 1 つ以上の列から、または 1 つのテーブルのすべての列からフィルターを削除します。
KEEPFILTERS 同じ列の既存のフィルターを削除せずに、フィルターを追加します。
USERELATIONSHIP 関連する列の間に非アクティブなリレーションシップを使用します。この場合、アクティブなリレーションシップは自動的に非アクティブになります。
CROSSFILTER フィルターの方向を変更します (両方から単一または単一から両方)。または、リレーションシップを無効にします。

1 ALL およびその変形関数は、フィルター変更としても、テーブル オブジェクトを返す関数としても動作します。 お使いのツールで REMOVEFILTERS 関数がサポートされている場合は、これを使用してフィルターを削除することをお勧めします。

戻り値

式の結果の値。

解説

  • フィルター式を指定した場合、CALCULATE 関数により、フィルター コンテキストが変更され、式が評価されます。 フィルター式ごとに、フィルター式が KEEPFILTERS 関数でラップされていない場合、2 つの標準的な結果が考えられます。

    • 列 (またはテーブル) がフィルター コンテキストに含まれない場合は、新しいフィルターがフィルター コンテキストに追加され、式が評価されます。
    • 列 (またはテーブル) が既にフィルター コンテキスト内にある場合は、新しいフィルターによって既存のフィルターが上書きされ、CALCULATE 式が評価されます。
  • "フィルターなし" で使用する CALCULATE 関数は、特定の要件を満たします。 行コンテキストをフィルター コンテキストに移行します。 モデル データを集計する式 (モデル メジャーではない) を行コンテキストで評価する必要がある場合に必須です。 このシナリオは、計算列の数式で、または反復子関数の式が評価されるときに生じることがあります。 モデル メジャーが行コンテキストで使用される場合は、コンテキストの移行が自動的に行われることに注意してください。

  • この関数は、計算列または行レベルのセキュリティ (RLS) ルールで使用される場合、DirectQuery モードでの使用はサポートされません。

次の Sales テーブルのメジャー定義により、収益結果が生成されますが、対象は青色の製品のみです。

この記事の例は、Adventure Works DW 2020 Power BI Desktop のサンプル モデルで使用できます。 モデルを取得するには、「DAX サンプル モデル」を参照してください。

Blue Revenue =
CALCULATE(
    SUM(Sales[Sales Amount]),
    'Product'[Color] = "Blue"
)
カテゴリ Sales Amount 青色の収益
Accessories $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 テーブルのメジャー定義により、すべての販売チャネルの売上に対する売上の比率が生成されます。

チャネル Sales Amount チャネル合計に対する収益の割合
インターネット $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 列の値 (フィルター コンテキスト内) の合計を、変更されたフィルター コンテキスト内の同じ式で除算します。 これは、フィルター変更関数である 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 関数を使用して、CustomerKey 列を除くすべての Customer テーブル列からフィルターを削除します。

フィルター コンテキスト
行コンテキスト
CALCULATETABLE 関数
フィルター関数