フィルター引数として 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 論理演算子 (||) の使用
関連コンテンツ
- フィルター関数 (DAX)
- ラーニング パス: Power BI Desktop で DAX を使用する
- 問。 Power BI コミュニティに問い合わせ
- ご提案はありますか? アイデアを投稿して Power BI を向上させる