DAX の数式内でのデータのフィルター処理

このセクションでは、Data Analysis Expressions (DAX) 式の中でフィルターを作成する方法について説明します。式の中でフィルターを作成し、計算に使われるソース データから取得される値を制限できます。この処理を行うには、式への入力として使うテーブルを指定し、フィルター式を定義します。指定したフィルター式はデータの照会に使われ、ソース データのサブセットのみを返します。式の結果を更新するたびに、データの現在のコンテキストに応じて、フィルターが動的に適用されます。

この記事の内容

式で使うテーブルに関するフィルターの作成

重複を削除するフィルター

コンテキストがフィルターに与える影響

フィルターの削除

ALL 関数によるすべてのフィルターの上書き

ALLEXCEPT 関数による特定のフィルターの上書き

式で使うテーブルに関するフィルターの作成

入力としてテーブルが使われる式の中で、フィルターを適用することができます。 指定したテーブルの行のサブセットを定義するには、テーブル名を入力する代わりに、FILTER 関数を使います。 このサブセットは別の関数に渡され、カスタム集計などの処理に使われます。

たとえば、販売店の受注情報を含むデータ テーブルを基に、各販売店の売上額を計算するとします。ただし、表示したいのは、高価な製品を複数販売した販売店の売上額です。次に示す式は、DAX サンプル ブックを基に、フィルターを使ってこの計算式を作成する例の 1 つです。

=SUMX(
     FILTER ('ResellerSales_USD', 'ResellerSales_USD'[Quantity] > 5 &&
     'ResellerSales_USD'[ProductStandardCost_USD] > 100),
     'ResellerSales_USD'[SalesAmt]
     )

  • 式の最初の部分は、引数としてテーブルを取る PowerPivot 集計関数の中から 1 つを指定します。 SUMX はテーブルの合計を計算します。

  • 式の 2 番目の部分である FILTER(table, expression), は、使うデータを SUMX に指示します。SUMX ではテーブル、または結果としてテーブルを返す式が必要です。テーブル内のすべてのデータを使う代わりに、FILTER 関数を使って、テーブルのどの行を使うのかを指定します。

    フィルター式には 2 つの部分があります。最初の部分は、フィルターが適用されるテーブルを指定します。 2 番目の部分は、フィルター条件として使う式を定義します。 この場合は、販売数が 5 を超えている販売店と、価格が 10,000 円を超える製品を絞り込んでいます。 演算子 && は論理 AND 演算子です。両方の条件が true の行のみが、フィルター後のサブセットに含まれます。

  • 式の 3 番目の部分は、合計する値を SUMX 関数に指示します。 この場合は、売上高のみを使います。

    FILTER のようにテーブルを返す関数は、テーブルまたは行を直接返しません。常に別の関数に埋め込まれます。FILTER などのフィルター処理に使われる関数 (およびその例) の詳細については、「フィルター関数 (DAX)」を参照してください。

    注: フィルター式は、使われているコンテキストの影響を受けます。たとえば、フィルターを使っているメジャーが、さらにピボットテーブルまたはピボットグラフで使われている場合、返されるデータのサブセットは、ユーザーがピボットテーブルで適用した他のフィルターまたはスライサーの影響を受けることがあります。コンテキストの詳細については、「DAX の数式のコンテキスト」を参照してください。

重複を削除するフィルター

特定の値のフィルター処理を行うだけでなく、別のテーブルまたは列の一意の値セットを返すことができます。 この処理は、一意の値が列内にいくつあるかカウントしたり、一意の値のリストを他の演算に使ったりする場合に便利です。 DAX には、DISTINCT 関数および VALUES 関数という、重複しない値を返す関数が 2 つあります。

  • DISTINCT 関数は、この関数の引数として指定された 1 つの列を調べて、重複しない値だけが含まれる新しい列を返します。

  • VALUES 関数も一意の価のリストを返しますが、不明なメンバーも返します。この関数は、リレーションシップによって結合された 2 つのテーブルの値を使います。一方のテーブルに存在し、別のテーブルに存在しない値がある場合に便利です。 不明なメンバーの詳細については、「DAX の数式のコンテキスト」を参照してください。

これらの関数は両方とも値を含む列全体を返します。したがって、この関数を使うと、値のリストを取得して別の関数に渡すことができます。 たとえば、次の式を使って、一意の製品キーを基に特定の販売店で販売された重複のない製品のリストを取得した後に、COUNTROWS 関数を使ってこのリスト内の製品数をカウントすることができます。:

=COUNTROWS(DISTINCT('ResellerSales_USD'[ProductKey]))

ページの先頭へ

コンテキストがフィルターに与える影響

ピボットテーブルまたはピボットグラフに DAX 数式を追加すると、式の結果がコンテキストの影響を受けることがあります。PowerPivot テーブル内で作業している場合、コンテキストは現在の行およびその値です。ピボットテーブルまたはピボットグラフ内で作業している場合、コンテキストはスライスやフィルター処理などの処理によって定義されるデータのセットまたはサブセットを意味します。ピボットテーブルまたはピボットグラフでは、設計上の理由から、独自のコンテキストも生じます。たとえば、売上を地域別および年度別にグループ化するピボットテーブルを作成した場合、これらの地域および年度に該当するデータのみがピボットテーブルに表示されます。そのため、ピボットテーブルに追加されたメジャーは、列見出しおよび行見出しに加えて、メジャーの数式内のフィルターというコンテキストに基づいて計算されます。

詳細については、「DAX の数式のコンテキスト」を参照してください。

ページの先頭へ

フィルターの削除

複雑な数式を処理する場合は、現在のフィルターの内容を正確に把握したり、あるいは数式のフィルター部分を変更したりしなければならないことがあります。 DAX には、フィルターの削除や、現在のフィルター コンテキストの一部として保持される列の制御を行う関数がいくつか用意されています。 このセクションでは、これらの関数が数式の結果に及ぼす影響について概要を示します。

ALL 関数によるすべてのフィルターの上書き

ALL 関数を使うと、以前に適用されたフィルターをすべて上書きして、集計などの処理を行う関数にテーブル内のすべての行を返すことができます。ALL の引数としてテーブルでなく 1 つ以上の列を使った場合、ALL 関数はコンテキスト フィルターを無視して、すべての行を返します。

注: リレーショナル データベースの用語について理解しているユーザーは、ALL をすべてのテーブルの自然左外部結合を生成する関数とみなすことができます。

たとえば、Sales および Products というテーブルがある場合に、現在の製品の総売上額をすべての製品の売上額で割った値を計算する数式を作成するとします。メジャーで数式が使われている場合は、注意する必要があります。行に製品名が含まれている場合、ピボットテーブルのユーザーは特定の製品のフィルター処理にスライサーを使っている可能性があります。したがって、フィルターやスライサーを無視して分母の真の値を導くためには、ALL 関数を追加してすべてのフィルターを上書きする必要があります。次の数式は、ALL を使って以前に適用したフィルターの効果を上書きする例の 1 つです。

=SUM (Sales[Amount])/SUMX(Sales[Amount], FILTER(Sales, ALL(Products)))

  • 数式の最初の部分の SUM (Sales[Amount]) は分子を計算します。

  • 合計には現在のコンテキストが反映されます。つまり、計算列に数式を追加した場合は、行コンテキストが適用されます。ピボットテーブルにメジャーとして数式を追加した場合は、ピボットテーブルに適用されているすべてのフィルター (フィルター コンテキスト) が適用されます。

  • 数式の 2 番目の部分は分母を計算します。ALL 関数は、Products テーブルに適用される可能性のあるすべてのフィルターを上書きします。

例を含めて、詳細については、「ALL 関数 (DAX)」を参照してください。

ALLEXCEPT 関数による特定のフィルターの上書き

ALLEXCEPT 関数も既存フィルターを上書きしますが、既存フィルターの一部を維持するように指定できます。ALLEXCEPT 関数の引数として列を指定すると、その列についてはフィルター処理が続けられます。一部を除くほとんどの列のフィルター処理を上書きする場合は、ALL 関数よりも ALLEXCEPT 関数の方が便利です。ALLEXCEPT 関数は、さまざまな列に対するフィルター処理ができるピボットテーブルを作成する場合や、数式で使われる値を制御する場合に特に便利です。ピボットテーブルで LLEXCEPT を使う例を含めて、詳細については、「ALLEXCEPT 関数 (DAX)」を参照してください。

ページの先頭へ

スキルを磨く
トレーニングの探索
新機能を最初に入手
Office Insider に参加する

この情報は役に立ちましたか?

ご意見をいただきありがとうございます。

フィードバックをお寄せいただき、ありがとうございます。Office サポートの担当者におつなぎいたします。

×