フィルター コンテキストを変更する
CALCULATE 関数を使用して、数式内のフィルター コンテキストを変更できます。 CALCULATE 関数の構文は次のとおりです。
CALCULATE(<expression>, [[<filter1>], <filter2>]…)
この関数では、スカラー値を返す式と、必要な数のフィルターを渡す必要があります。 式には、メジャー (名前付きの式) またはフィルター コンテキストで評価できる任意の式を指定できます。
フィルターには、ブール式またはテーブル式を指定できます。 フィルター コンテキストを変更するときに、より詳細な制御を提供するフィルター変更関数を渡すこともできます。
複数のフィルターがある場合、それらは AND 論理演算子を使用して評価されます。つまり、すべての条件が同時に TRUE でなければなりません。
注
CALCULATETABLE 関数は、テーブル オブジェクトを返す式に適用されるフィルター コンテキストを変更する点を除いて、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 メジャーを追加します。
次の例では、次のメジャーを使用して Revenue メジャーを複数の色別にフィルター処理しています。
IN 演算子の後に色の値のリストが続いていることに注目してください。
Revenue Red or Blue =
CALCULATE(
[Revenue],
'Product'[Color] IN {"Red", "Blue"}
)
次のメジャーは、高価な製品によって Revenue メジャーをフィルターします。 高価な製品とは、定価が 1,000 米ドルを超える製品です。
Revenue Expensive Products =
CALCULATE(
[Revenue],
'Product'[List Price] > 1000
)
テーブル式フィルターを適用する
テーブル式フィルターでは、テーブル オブジェクトがフィルターとして適用されます。 モデル テーブルへの参照を指定することができます。ただし、おそらくは、テーブル オブジェクトを返す DAX 関数です。
通常、FILTER 関数は、ブール フィルター式では定義できないものも含め、複雑なフィルター条件を適用するために使用されます。
FILTER 関数は反復子関数として分類されるため、テーブルまたはテーブル式と、そのテーブルの各行を評価する式を渡します。
FILTER 関数は、渡されたテーブルとまったく同じ構造を持つテーブル オブジェクトを返します。 その行は、渡された行のサブセットです。つまり、式が TRUE と評価された行を意味します。
次の例は、FILTER 関数を使用するテーブル フィルター式を示しています。
Revenue High Margin Products =
CALCULATE(
[Revenue],
FILTER(
'Product',
'Product'[List Price] > 'Product'[Standard Cost] * 2
)
)
この例では、FILTER 関数はフィルター コンテキスト内の製品テーブルのすべての行をフィルター処理します。 定価が標準コストの 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 メジャーが追加されました。
Color テーブルの Product 列にはフィルターが適用されていないため、メジャーの評価により、新しいフィルターがフィルター コンテキストに追加されます。 最初の行の $2,681,324.79 の値は、Australian (オーストラリア) 地域で売れた赤色の製品のものです。
テーブル ビジュアルの最初の列を Region から Color に切り替えると、結果が異なります。これは、Color テーブルの Product 列がフィルター コンテキストに移動したからです。
Revenue Red メジャー式は、Product テーブルの Color 列 (赤) にフィルターを追加して Revenue メジャーを評価します。 色別にグループ化されたこのビジュアルでは、メジャー式によってフィルター コンテキストが新しいフィルターで上書きされます。
これは望ましい結果かもしれませんし、そうではないかもしれません。 次のユニットでは、フィルターを上書きするのではなく保持するために使用できるフィルター変更関数である KEEPFILTERS 関数について説明します。