フィルター引数として FILTER を使用しない

データ モデル作成者は、変更されたフィルター コンテキストで評価する必要がある DAX 式を記述することがよくあります。 たとえば、"高利益の商品" の売上を計算するメジャー定義を作成できます。 この計算については、この記事の後半で説明します。

注意

この記事は、インポート テーブルにフィルターを適用するモデル計算に特に関連しています。

CALCULATECALCULATETABLE DAX 関数は、重要で便利な関数です。 これらを使用して、フィルターを削除または追加したり、リレーションシップ パスを変更したりする計算を作成できます。 これは、ブール式、テーブル式、または特殊なフィルター関数のいずれかであるフィルター引数を渡すことによって行います。 この記事では、ブール式とテーブル式についてのみ説明します。

テーブル式を使用して赤色の製品の売上を計算する次のメジャー定義について考えてみます。 これにより、Product テーブルに適用される可能性のあるすべてのフィルターが置き換えられます。

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

CALCULATE 関数で、FILTER DAX 関数によって返されるテーブル式を受け取り、Product テーブルの各行に対してフィルター式を評価します。 これにより、正しい結果 (赤色の製品の売上結果) を取得できます。 ただし、ブール式を使用すると、より効率的に実現できます。

テーブル式の代わりにブール式を使用した、強化されたメジャー定義を次に示します。 KEEPFILTERS DAX 関数では、Color 列に適用されている既存のフィルターは保持され、上書きされることはありません。

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

可能な限り、フィルター引数をブール式として渡すことをお勧めします。 これは、インポート モデル テーブルがメモリ内の列ストアであるためです。 それらは、この方法で列を効率的にフィルター処理するように、明示的に最適化されます。

ただし、ブール式をフィルター引数として使用する場合に適用される制限があります。 それらは次のとおりです。

  • 複数のテーブルから列を参照できません
  • メジャーを参照することはできません
  • 入れ子になった CALCULATE 関数は使用できません
  • テーブルをスキャンまたは返す関数は使用できません

つまり、より複雑なフィルター要件にはテーブル式を使用することが必要になります。

ここで、別のメジャー定義を考えてみましょう。 要件は、利益を達成した月のみについて売上を計算することです。

Sales for Profitable Months =
CALCULATE(
    [Sales],
    FILTER(
        VALUES('Date'[Month]),
        [Profit] > 0)
    )
)

この例では、FILTER 関数を使用する必要があります。 これは、利益を達成できなかった月を除外するために、Profit メジャーを評価する必要があるためです。 ブール式をフィルター引数として使用する場合、ブール式の中でメジャーを使用することはできません。

推奨事項

最良のパフォーマンスを得るには、可能な限り、ブール式をフィルター引数として使用することをお勧めします。

そのため、FILTER 関数は必要な場合にのみ使用してください。 それは複雑な列の比較のフィルター処理を行う場合に使用できます。 これらの列の比較には、次のものがあります。

  • メジャー
  • 他の列
  • OR DAX 関数、または OR 論理演算子 (| |) の使用