今回はフィルターを通したテーブルを返してくれるFILTER関数を初心者目線で紹介したいと思います。
難易度の高いDAX式を作っていくほど、メジャーや計算列を作っていくほど避けては通れない関数です。避けては通れないと言っても、自分にとって壁になるのではなく、使わずにはいられないと言う意味です!!
目次
FILTERの基本
MSのリファレンスにはこの通り書かれています。
別のテーブルまたは式のサブセットを表すテーブルを返します
この説明が最初パッとこなかったですが、さらにわかりやすく言うと、
FILTER関数は、指定されたフィルターを適用したテーブルを返すもの。
そして定義されている構文は以下の通りです。
FILTER(<table>,<filter>)
FILTER(<表>,<表に適用したいフィルター>)
<table>(表)
こちらには返したいテーブルを渡します。(フィルターを適用するテーブル)。ここに渡すテーブルはPower Queryでインポートしたテーブルでも、計算テーブルとしてDAXで作ったテーブルでもOKです。
<filter>(表に適用したいフィルター)
こちらには<table>で私たテーブルに大して適用したいフィルターを並べていきます。
フィルターの例は次のセクションで紹介します。
テーブルに適用できるフィルター
あるテーブルにかけられるフィルターとして整数などの数字フォーマットの場合は
x以上、x以下、xとイコールまたはそれ以上、イコール、空欄か。
テキストのフォーマットの場合は、
”x”が含まれているか、”x”と同じか、文字数によって、空欄か。
日付の場合は、
x日より後か、x日より前か、x日より同じか、月が同じか、年が同じか、x日とx日の間。
まず考え方として、元々あるテーブルにマウスを使ってかけられるフィルターはFILTER関数でもできる思ってください。これに加えて他の関数を使って更に高度なフィルターをかけることもできます。(例えば、この値と関連がある他のテーブルの値を比べたフィルターなど。)なので上で紹介したフィルターの例は本当に氷山の一角なのです。
使い道
FILTER関数の用途の例としては、計算をする時です。計算をする時には母数や他の数字を見つけるためにこのFILTER関数を使うのです。数々のフィルターを通して戻ってきたテーブルの行数を数えて数字を見つけるのです。この時FILTER関数を使って実際にテーブルを作るのではなく、メモリーの中で仮想テーブルを作り出しながら計算して行くのです。
FILTER関数を使ってみる
このセクションでは実際にフィルター関数を使っていきたいと思います。FILTER関数がどのような挙動をするのかを確かめるために新しいテーブルでFILTER関数を使っていきます。
まずはシナリオ
今回もRANKXの使い方で使ったとてもシンプルな表を使いたいと思います。内容としては、月々のテストの結果をまとめた表です。
テーブルの名前:Test Marks by Month
1列目:日付(日付フォーマット)
2列目:点数(整数フォーマット)
実際にFILTER関数でテーブルにフィルターを1つかけてみる
演習用に、今回は上のテーブルにフィルターを1つだけかけます。そして返えされたテーブルの行の数を数えて確かめます。
構文を確かめます。
FILTER(<table>,<filter>)
ですので、<table>にはテーブル名の”Test Marks by Month”が入り、filterにフィルターを入れていきます。
点数が100だけを残すフィルター
完成するDAXは以下の通りです。
FILTER('Test Marks by Month','Test Marks by Month'[点数]=100)
フィルターの部分は
’Test Marks by Month'[点数]=100
考え方としてはフィルターを掛けたい列+当てたいフィルターです。結果は以下の通りです。
列の面で見てわかるのが、フィルターをかけているのは1列だけですが返ってくるのは全ての列ですね。
行の面では、点数イコール100のフィルターを掛けているのでやはり返ってきたのは点数が100の1行ですね。
点数が90位上だけを残すフィルター
今回は点数が90位上だけを残すフィルターです。できるDAXは以下の通り。
FILTER('Test Marks by Month','Test Marks by Month'[点数]>=90)
結果は以下の通りです。90位上の行7行が返ってきます。もちろんそれに加えて全ての列も戻ってきます。
FILTER関数でテーブルにフィルターを2つかけてみる(複数条件)
次はFILTER関数に複数のフィルターを当てる方法です。今回は二つ掛けてみます。
フィルターを複数かける方法は、各フィルターの間に&サインを二つ付けるとできます。構文に当てはめてみると、下の通りになります。”&&”を付けるだけで複数フィルター条件を付けることができます。
FILTER(<table>,<filter>&&<filter>&&<filter>)
点数が90点位上、98点未満だけを残すフィルター
条件が二つある場合はAND関数などで示せますが(後に紹介)、今回はフィルターを複数付ける方法を使います(&&を付ける)できるDAXは以下の通りです。
FILTER('Test Marks by Month','Test Marks by Month'[点数]>=90&&'Test Marks by Month'[点数]<98)
上の通り、「&&」を使ってフィルターをつなげています。今回は同じ列に二つフィルターを掛けていますがもちろん別の列にフィルターをかける事もできます。結果は下の通り。
しっかりと90位上98未満の点数の5行が返されています。加えて他の列も返されています。
FILTER関数で関数をフィルターに組み込む(AND関数)
関数のフィルター部分は、必ずしも<、>や=と言った不等号でなくも良いのです。
先ほどの90点以上の98点未満のフィルターですが、AND関数を使って「両方とも条件を満たす場合」と言うフィルターを付ける事ができます。完成するDAXは以下の通りです。
FILTER('Test Marks by Month',AND('Test Marks by Month'[点数]>=90,'Test Marks by Month'[点数]<98))
上のようにFILTER関数のフィルター部分に関数を当て、その関数が返す値をフィルターとする事ができます。AND関数はもし両方の条件が満たされればTRUEを返します。逆にもし片方でも条件外だった場合は、FALSEを返します。
このプロセスを点数列の値1つ一つに適用します。AND関数の戻り値がTRUEであればFILTER関数の戻り値のテーブルに含まれます。
まとめ
基本の構文は以下の通りです。
FILTER(<table>,<filter>)
FILTER(<表>,<表に適用したいフィルター>)
その他のポイント
- <table>と<filter>はどちらも同じテーブル内でなければならない
- フィルターは複数、「&&」を使って適用できる
- フィルターに関数を置き、その戻り値をフィルターに使う事ができる。
- 複数の列にフィルターをかける事ができる
- 1つの列だけにフィルターを掛けたとしても全ての列が返ってきます
以上、「【Power BI DAX】初心者のためのFILTER関数の使い方」でした。
1件の返信
[…] 【Power BI DAX】初心者のためのFILTER関数の使い方https://kazuworldtravel.com/power-bi-dax-filter/今回はフィルターを通したテーブルを返してくれるFILTER関数を初心者目線で紹介したいと思います。難 […]