21
6

More than 1 year has passed since last update.

ISFILTEREDとその応用(スライサーを利用してビジュアル上で動的にカテゴリを振り分ける)

Last updated at Posted at 2022-12-14

この記事はMicrosoft Power BI Advent Calendar 2022に参加しています。
使用しているPower BIは2022/12/15時点の最新バージョンです。

ISFILTERED

ISFILTEREDは、指定されたテーブルまたは列が直接フィルター処理されている場合にTRUEを返します。
どういう動きをするか見ていきましょう。

検証で利用するデータセット

Power BIの神Takeshi Kagataさんが作成したサンドボックスのデータを利用させていただきました。
ファクトが1つ、ディメンションが4つのスタースキーマです。
image.png
image.png

ISFILTEREDの検証

ISFILTEREDの動作を検証するために、ディメンションテーブルをISFILTEREDの引数にしてみましょう。
今回利用するPersonsテーブルは社員と所属のIDと、それぞれの表示名で構成されています。
image.png

メジャーは以下の通りです。

ISFILTERED所属
ISFILTERED所属 = ISFILTERED('Persons'[所属])

Personsテーブルから所属の列をISFILTEREDの引数とします。
このメジャーをレポートページに置いただけではFalseになります。
image.png

スライサーの場合

所属のスライサーをページに追加して大阪支社を選択してみます。
大阪支社が選択されるとメジャーはTrueになりました。

ISFILTEREDは、指定されたテーブルまたは列が直接フィルター処理されている場合にTRUEを返します。

ここではISFILTEREDの引数にした所属フィールドが直接フィルターされたため、Trueになります。
image.png
次に同じPersonsテーブルから所属に変わり氏名をスライサーに設定し、加藤さんを選択してみます。
image.png
メジャーはFalseのままです。

ISFILTEREDは、指定されたテーブルまたは列が直接フィルター処理されている場合にTRUEを返します。

この場合、加藤さんの所属東京支社ですが、氏名のスライサーで所属列が間接的にフィルターされているためメジャーはFalseとなります。
image.png

階層化したスライサーの場合

Personsテーブルから所属氏名をスライサーに階層化して配置します。
所属が上位、氏名が下位です。
image.png
氏名から松沢さんを選択してみましょう。
image.png
メジャーはTrueになりました。
先ほどの加藤さんを選択した時とは異なる結果ですが、これは階層化したスライサーで下位の氏名を選択した結果、上位の所属も選択されているためです。
image.png

所属にフィルターを掛けたメジャーと同じテーブルビジュアルに置いた場合

[ISFILTERED所属]を以下のメジャーと同じテーブルビジュアルに配置してみる。

所属を大阪支社でフィルター
所属を大阪支社でフィルター = CALCULATE([数量合計],'Persons'[所属]="大阪支社")

image.png
Falseのままです。
ISFILTEREDは同じビジュアルに配置された他のメジャー内で使われているフィルター式には反応しません。

他のビジュアルから相互作用でフィルターされた場合

他のビジュアルで所属を含む行が選択された場合を見てみましょう。
image.png
[ISFILTERED所属]Trueになりました。

所属を含むテーブルビジュアルで行が選択されているため、相互作用で直接所属列がフィルター処理されています。

同じテーブルビジュアルにISFILTEREDの引数で使った列を置いた場合

同じテーブルビジュアルの中にメジャーと所属列を配置します。
image.png
テーブル内は所属列でビジュアル内でフィルターが掛かっているためTrueになりますが、総計はテーブル内に配置された列のフィルターは関係無くなるためFalseとなります。

スライサーでフィルターを掛けた場合、総計はどうなるでしょう?
image.png
この場合、ビジュアルの相互作用で総計にも所属列がフィルター処理されるため、[ISFILTERED所属]Trueになります。

応用編 : ISFILTEREDでスライサーを利用してビジュアル上で動的にカテゴリを振り分ける

ここでは以下の図で、右のスライサーで選択した項目のみを集計対象YESとして縦棒グラフで動的にカテゴライズしている方法を説明します。
image.png

スライサーで選んだ項目だけを計算する

まずスライサーで選んだ項目だけを計算するメジャーを作る必要があります。
計算式は以下の通りです。

集計対象YES
集計対象YES = IF(ISFILTERED('Persons'[所属])||ISFILTERED(Persons[氏名]),[数量合計],BLANK())

メジャー集計対象YESの解説

ISFILTERED('Persons'[所属])ISFILTERED(Persons[氏名])をOR条件の論理演算子||で繋いでいます。
こうする事で、所属氏名のどちらかをスライサーで選ぶとTrueを返すようになります。

後はTrueであれば[数量合計]を、FalseであればBLANK()を返せばスライサーで項目を選択した時のみ[数量合計]が表示されます。
image.png

スライサーで選んでいない項目だけを計算する

次は先ほど作成した[集計対象YES]のメジャーを利用して、スライサーで選んでいない項目だけを計算するメジャーを作ります。
計算式は以下の通りです。

集計対象NO
集計対象NO = CALCULATE([数量合計],REMOVEFILTERS(Persons[所属]),REMOVEFILTERS(Persons[氏名]))-[集計対象YES]

メジャー集計対象NOの解説

まずREMOVEFILTERS[数量合計]からPersons[所属]Persons[氏名]のフィルターを外します。
こうする事でスライサーで選択された所属氏名のフィルターを無視して[数量合計]が算出されます。

後は算出された値をメジャー[集計対象YES]でマイナスすれば、[集計対象YES]を除いた差分が算出されます。
image.png

まとめ

ISFILTEREDは引数で指定したテーブルや列が直接フィルター処理されている必要がある

間接的なフィルターでは動作しません。

行コンテキストの範囲を考えよう

テーブルビジュアルでもグリッド内と合計ではフィルターの掛かり方が違います。

やりたい事に対して想像力を膨らまそう

用意されていない機能でも工夫で何とか出来る場合もあります。


フィルターの状況に応じて動くDAX関数はISFILTEREDの他にもFILTERSHASONEFILTERHASONEVALUEISCROSSFILTEREDISINSCOPE等があります。
一通り目を通して実際に触ってみると、実務で生かせる何かが見えてくるかもしれません。

21
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
6