フィルター コンテキストを変更する

完了

CALCULATE DAX 関数を使用すると、数式のフィルター コンテキストを変更できます。 CALCULATE 関数の構文は次のとおりです。

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

この関数では、スカラー値を返す式と、必要な数のフィルターを渡す必要があります。 式には、メジャー (名前付きの式) またはフィルター コンテキストで評価できる任意の式を指定できます。

フィルターには、ブール式またはテーブル式を指定できます。 フィルター コンテキストを変更するときに、追加の制御を指定したフィルター変更関数を渡すこともできます。

複数のフィルターがある場合、それらは AND 論理演算子を使用して評価されます。つまり、すべての条件が同時に TRUE である必要があります。

注意

CALCULATETABLE DAX 関数では、CALCULATE 関数とまったく同じ機能が実行されますが、テーブル オブジェクトを返す式に適用されるフィルター コンテキストが変更される点が異なります。 このモジュールでは、説明と例に CALCULATE 関数を使用していますが、これらのシナリオは CALCULATETABLE 関数にも適用できることを覚えておいてください。

ブール式フィルターを適用する

ブール式フィルターとは、TRUE または FALSE に評価される式です。 ブール フィルターは、次の規則に従う必要があります。

  • 1 つの列のみを参照できます。
  • メジャーを参照することはできません。
  • SUM などの集計関数を含むテーブルをスキャンまたは返す関数を使用することはできません。

この例では、メジャーを作成します。 まず、Adventure Works DW 2020 M06.pbix ファイルをダウンロードして開きます。 次に、赤色の製品にブール式フィルターを使用して Revenue (収益) メジャーをフィルター処理する次のメジャーを、Sales (売上) テーブルに追加します。

Revenue Red = CALCULATE([Revenue], 'Product'[Color] = "Red")

レポートの [ページ 1] にあるテーブルの視覚エフェクトに Revenue Red (赤の収益) メジャーを追加します。

画像は、3 つの列を持つテーブルを示しています (Region (地域)、Revenue (収益)、Revenue Red (赤の収益))。テーブルには 10 行と合計が表示されています。

次の例では、次のメジャーを使用して Revenue (収益) メジャーを複数の色別にフィルター処理しています。 IN 演算子が使用された後に色の値の一覧が続くことに注目してください。

Revenue Red or Blue = CALCULATE([Revenue], 'Product'[Color] IN {"Red", "Blue"})

次のメジャーでは、Revenue (収益) メジャーを高額な製品でフィルター処理しています。 高額な製品とは、定価が 1000 米国ドルを超える製品です。

Revenue Expensive Products = CALCULATE([Revenue], 'Product'[List Price] > 1000)

テーブル式フィルターを適用する

テーブル式フィルターでは、テーブル オブジェクトがフィルターとして適用されます。 モデル テーブルへの参照を指定することができます。ただし、おそらくは、テーブル オブジェクトを返す DAX 関数です。

一般的に、FILTER DAX 関数を使用するのは、ブール フィルター式で定義できないものなど、複雑なフィルター条件を適用する場合です。 FILTER 関数は反復子関数として分類されるので、テーブルまたはテーブル式、およびそのテーブルの各行を評価する式を渡します。

FILTER 関数からは、テーブルから渡されたものとまったく同じ構造のテーブル オブジェクトが返されます。 その行は、渡された行のサブセットです。つまり、式が TRUE と評価された行を意味します。

次の例は、FILTER 関数を使用するテーブル フィルター式を示しています。

Revenue High Margin Products =
CALCULATE(
    [Revenue],
    FILTER(
        'Product',
        'Product'[List Price] > 'Product'[Standard Cost] * 2
    )
)

この例の FILTER 関数では、フィルター コンテキストにある Product (製品) テーブルのすべての行をフィルター処理しています。 定価が標準コストの 2 倍を超える製品の各行は、フィルター処理されたテーブルの行として表示されます。 そのため、Revenue (収益) メジャーは、FILTER 関数から返されるすべての製品に対して評価されます。

CALCULATE 関数に渡されるすべてのフィルター式は、テーブル フィルター式です。 ブール フィルター式は、書き込みと読み取りのエクスペリエンスを向上させるための省略表記です。 内部的に、Microsoft Power BI では、ブール フィルター式がテーブル フィルター式に変換されます。この方法で、Revenue Red (赤の収益) メジャー定義を変換しています。

Revenue Red =
CALCULATE(
    [Revenue],
    FILTER(
        'Product',
        'Product'[Color] = "Red"
    )
)

フィルターの動作

フィルター式を CALCULATE 関数に追加すると、2 つの標準的な結果が生成されます。

  • 列 (またはテーブル) がフィルター コンテキストに含まれない場合は、新しいフィルターがフィルター コンテキストに追加され、CALCULATE 式が評価されます。
  • 列 (またはテーブル) が既にフィルター コンテキスト内にある場合、既存のフィルターは新しいフィルターによって上書きされ、CALCULATE 式が評価されます。

次の例は、CALCULATE 関数にフィルター式を追加する方法を示しています。

注意

各例では、テーブルの視覚エフェクトにフィルターは適用されていません。

前のアクティビティと同様に、地域ごとにグループ化して収益を表示するテーブルの視覚エフェクトに Revenue Red (赤の収益) メジャーが追加されました。

画像は、3 つの列を持つテーブルを示しています (Region (地域)、Revenue (収益)、Revenue Red (赤の収益))。テーブルには 10 行と合計が表示されています。

Product テーブルの Color 列にはフィルターが適用されていないため、メジャーの評価によってフィルター コンテキストに新しいフィルターが追加されます。 最初の行の $2,681,324.79 の値は、Australian (オーストラリア) 地域で売れた赤色の製品のものです。

テーブルの視覚エフェクトの最初の列を Region (地域) から Color (色) に切り替えると、Product (製品) テーブルの Color (色) 列がフィルター コンテキストになるため、異なる結果が生成されます。

画像は、3 つの列を持つテーブルを示しています (Color (色)、Revenue (収益)、Revenue Red (赤の収益))。テーブルには 10 行と合計が表示されています。Revenue Red (赤の収益) の値は各行で同じです。

Revenue Red (赤の収益) メジャー式では、Product (製品) テーブルの Color (色) 列にフィルターを追加することで、Revenue (収益) メジャーが評価されます。 その結果、色でグループ化されたこの視覚エフェクトでは、メジャー式によって、フィルター コンテキストが新しいフィルターで上書きされます。

これは望ましい結果かもしれませんし、そうではないかもしれません。 次のユニットでは、KEEPFILTERS DAX 関数を紹介します。これは、フィルターを上書きするのではなく保持するために使用できるフィルター変更関数です。