次の方法で共有


フィルター引数として FILTER を使用しないようにする

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

手記

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

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

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

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

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

テーブル式の代わりにブール式を使用するメジャー定義の改善を次に示します。 KEEPFILTERSDAX 関数は、Color 列に適用されている既存のフィルターが保持され、上書きされないようにします。

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

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

ただし、フィルター引数として使用する場合、ブール式に適用される制限があります。 彼ら:

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

これは、より複雑なフィルター要件に対してテーブル式を使用する必要があることを意味します。

ここで、別の測定基準の定義について考えてみましょう。 要件は売上を計算することですが、利益を達成した月に限られます。

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

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

推奨 事項

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

したがって、FILTER 関数は、必要な場合にのみ使用する必要があります。 これを使用して、フィルターの複雑な列の比較を実行できます。 これらの列の比較には、次の処理が含まれます。

  • 措置
  • 他の列
  • ORDAX 関数または OR 論理演算子 (||) の使用