フィルター引数として FILTER を使用しない
データ モデル作成者は、変更されたフィルター コンテキストで評価する必要がある DAX 式を記述することがよくあります。 たとえば、"高利益の商品" の売上を計算するメジャー定義を作成できます。 この計算については、この記事の後半で説明します。
注意
この記事は、インポート テーブルにフィルターを適用するモデル計算に特に関連しています。
CALCULATE と CALCULATETABLE 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 論理演算子 (| |) の使用
関連するコンテンツ
- FILTER 関数 (DAX)
- ラーニング パス:Power BI Desktop で DAX を使用する
- わからないことがある場合は、 Power BI コミュニティで質問してみてください。
- Power BI チームへのご提案は、 Power BI を改善するためのアイデアをお寄せください