この記事はMicrosoft Power BI Advent Calendar 2022に参加しています。
使用しているPower BIは2022/12/15時点の最新バージョンです。
ISFILTERED
ISFILTEREDは、指定されたテーブルまたは列が直接フィルター処理されている場合にTRUEを返します。
どういう動きをするか見ていきましょう。
検証で利用するデータセット
Power BIの神Takeshi Kagataさんが作成したサンドボックスのデータを利用させていただきました。
ファクトが1つ、ディメンションが4つのスタースキーマです。
ISFILTEREDの検証
ISFILTEREDの動作を検証するために、ディメンションテーブルをISFILTEREDの引数にしてみましょう。
今回利用するPersons
テーブルは社員と所属のIDと、それぞれの表示名で構成されています。
メジャーは以下の通りです。
ISFILTERED所属 = ISFILTERED('Persons'[所属])
Persons
テーブルから所属
の列をISFILTEREDの引数とします。
このメジャーをレポートページに置いただけではFalse
になります。
スライサーの場合
所属のスライサーをページに追加して大阪支社
を選択してみます。
大阪支社
が選択されるとメジャーはTrue
になりました。
ISFILTEREDは、指定されたテーブルまたは列が直接フィルター処理されている場合にTRUEを返します。
ここではISFILTEREDの引数にした所属
フィールドが直接フィルターされたため、True
になります。
次に同じPersons
テーブルから所属
に変わり氏名
をスライサーに設定し、加藤さんを選択してみます。
メジャーはFalse
のままです。
ISFILTEREDは、指定されたテーブルまたは列が直接フィルター処理されている場合にTRUEを返します。
この場合、加藤さんの所属
は東京支社
ですが、氏名
のスライサーで所属
列が間接的にフィルターされているためメジャーはFalse
となります。
階層化したスライサーの場合
Persons
テーブルから所属
と氏名
をスライサーに階層化して配置します。
所属
が上位、氏名
が下位です。
氏名
から松沢さんを選択してみましょう。
メジャーはTrue
になりました。
先ほどの加藤さんを選択した時とは異なる結果ですが、これは階層化したスライサーで下位の氏名
を選択した結果、上位の所属
も選択されているためです。
所属にフィルターを掛けたメジャーと同じテーブルビジュアルに置いた場合
[ISFILTERED所属]
を以下のメジャーと同じテーブルビジュアルに配置してみる。
所属を大阪支社でフィルター = CALCULATE([数量合計],'Persons'[所属]="大阪支社")
False
のままです。
ISFILTEREDは同じビジュアルに配置された他のメジャー内で使われているフィルター式には反応しません。
他のビジュアルから相互作用でフィルターされた場合
他のビジュアルで所属を含む行が選択された場合を見てみましょう。
[ISFILTERED所属]
はTrue
になりました。
所属
を含むテーブルビジュアルで行が選択されているため、相互作用で直接所属
列がフィルター処理されています。
同じテーブルビジュアルにISFILTEREDの引数で使った列を置いた場合
同じテーブルビジュアルの中にメジャーと所属
列を配置します。
テーブル内は所属
列でビジュアル内でフィルターが掛かっているためTrue
になりますが、総計はテーブル内に配置された列のフィルターは関係無くなるためFalse
となります。
スライサーでフィルターを掛けた場合、総計はどうなるでしょう?
この場合、ビジュアルの相互作用で総計にも所属
列がフィルター処理されるため、[ISFILTERED所属]
はTrue
になります。
応用編 : ISFILTEREDでスライサーを利用してビジュアル上で動的にカテゴリを振り分ける
ここでは以下の図で、右のスライサーで選択した項目のみを集計対象YESとして縦棒グラフで動的にカテゴライズしている方法を説明します。
スライサーで選んだ項目だけを計算する
まずスライサーで選んだ項目だけを計算するメジャーを作る必要があります。
計算式は以下の通りです。
集計対象YES = IF(ISFILTERED('Persons'[所属])||ISFILTERED(Persons[氏名]),[数量合計],BLANK())
メジャー集計対象YESの解説
ISFILTERED('Persons'[所属])
とISFILTERED(Persons[氏名])
をOR条件の論理演算子||
で繋いでいます。
こうする事で、所属
と氏名
のどちらかをスライサーで選ぶとTrue
を返すようになります。
後はTrue
であれば[数量合計]
を、False
であればBLANK()
を返せばスライサーで項目を選択した時のみ[数量合計]が表示されます。
スライサーで選んでいない項目だけを計算する
次は先ほど作成した[集計対象YES]
のメジャーを利用して、スライサーで選んでいない項目だけを計算するメジャーを作ります。
計算式は以下の通りです。
集計対象NO = CALCULATE([数量合計],REMOVEFILTERS(Persons[所属]),REMOVEFILTERS(Persons[氏名]))-[集計対象YES]
メジャー集計対象NOの解説
まずREMOVEFILTERSで[数量合計]
からPersons[所属]
とPersons[氏名]
のフィルターを外します。
こうする事でスライサーで選択された所属
と氏名
のフィルターを無視して[数量合計]
が算出されます。
後は算出された値をメジャー[集計対象YES]
でマイナスすれば、[集計対象YES]
を除いた差分が算出されます。
まとめ
ISFILTEREDは引数で指定したテーブルや列が直接フィルター処理されている必要がある
間接的なフィルターでは動作しません。
行コンテキストの範囲を考えよう
テーブルビジュアルでもグリッド内と合計ではフィルターの掛かり方が違います。
やりたい事に対して想像力を膨らまそう
用意されていない機能でも工夫で何とか出来る場合もあります。
フィルターの状況に応じて動くDAX関数はISFILTEREDの他にもFILTERS、HASONEFILTER、HASONEVALUE、ISCROSSFILTERED、ISINSCOPE等があります。
一通り目を通して実際に触ってみると、実務で生かせる何かが見えてくるかもしれません。