Power BIでスライサーでどんどんテーブルをフィルターしていくと最終的に出てくるデータ。この絞り込んだ結果のデータを使ってつなげて何かしたいと思ったことはありませんか?
これを達成するために必要なのはフィルター後のテーブルのある列のデータを全てつなげるプロセスです。今回はこのプロセスを踏む時に使えるCONCATENATEX関数を紹介します。
CONCATENATEXの基本
MSのリファレンスにはこの通り書かれています。
テーブルの行ごとに評価される式の結果を連結します。
要は指定されたテーブルの指定された行をつなげて返してくれると言うもの。返されるのはテキスト文字列なので、出力の仕方によってはいろいろな使い方が期待されます。
そして定義されている構文は以下の通りです。
CONCATENATEX(<table>, <expression>, [delimiter])
CONCATENATEX<表>, <繋げたいデータがある列または式>, [連結時に使用する区切り記号(省略可能)])
<table>(表)
こちらにはつなげたい列が入っているテーブルを与えます。そしてこのテーブルの行の数だけ値がつながります。
<expression>(繋げたいデータがある列)
こちらには実際に繋げたいデータがある列を与えます。一列のデータだけを繋げたいのであればその列の名前だけでOKです。
ですがもし複数の列の文字列を繋げたい場合は式を書きます。
例えば苗字と名前のそれぞれの列を、真ん中にスペースを開けて繋げたい場合は以下の通りになります。(テーブル名=紅組) 各個人はカンマで分けます。
CONCATENATEX(紅組, [苗字]&" "&[名前], ",")
[delimiter](間に入れる記号)
こちらは各行で繋げた値動詞を何で分けるかです。一般的なのは「, (カンマ)」かもしれませんが用途によって自由に変えてみましょう。
CONCATENATEX関数を使ってみる
このセクションでは実際にCONCATENATEXを使ってみます。
まずはシナリオ
今回用意するファイルは4列ある月ごとのテストで、最高得点とその教科、その得点を出した人の苗字です。今回は分かりやすく新しい列に作っていきます。
一列目:日付
二列目;点数
三列目;教科の名前
四列目;最高得点者(苗字だけ)
シンプルに全ての行の値をつなげる
まずはシンプルに、何もルールも付けずに決められた列の値を全て繋げます。できるDAXは以下の通りです。
新しい列の名前=CONCATENATEX('Test Marks by Month','Test Marks by Month'[最高得点者(名字)],", ")
シンプルに、Test Marks by Monthテーブルの最高得点者(苗字)列を、「,(カンマ)」で分けながら繋げて。と言う感じです。結果は下の通り。
みてみると、しっかりとカンマで分けながら、列にある全ての値を追加していますね。順番は上からテーブルに並んでいる順です。実際にこれをリポートビューでカードビジュアルに当ててみると、しっかりと表示されます。
上から、下から順につなげる設定
一つ前で、テーブル名と列名以外何も指定しなかった場合はデフォルトで上から順に値を繋げます。ですがこれはしっかりと指定する事ができます。
MSの関数リファレンスでは
CONCATENATEX<table>, <expression>, [delimiter])
とされています。ですが実際にはこれに3つ更にパラメーターを与える事ができます。
つなげる順番は[delimiter]の後に並べたい列と並べ順を追加する事で実装できます。
新しい列=CONCATENATEX('Test Marks by Month','Test Marks by Month'[最高得点者(名字)],", ", 'Test Marks by Month'[点数], DESC)
降順の場合は「DESC」、昇順の場合は「ASC」と指定します。
上の画像は降順で、点数列の値によって並べる指定をした結果です。しっかりと100点の生徒が上にきて続いてそれより小さい値が続きます。
他の列の値でグループ化してつなげる
次は、ある列の値でグループ化してそのグループ事に値を繋げてみます。今回つかているテーブルには「教科」列があり、そこに様々な教科が入っていますので、そこの教科ごとに降順で名前を繋げていきます。まずは結果から。
最後の列を見てみると、しっかりと繋げれれている値はそれぞれの教科に関連している名前だけを見て繋げていますね。
実際にレポートビューにカードビジュアルで表示してみるとしっかりとスライサーに反応します。国語の場合は強化列が「国語」、理科の場合は「理科」の教科で最高得点が出た生徒の名前が出てきます。そして並べ順を指定しているので点数が高い順に表示されます。
使ったDAXは以下の通り、
CONCATENATE TEST 1 = CONCATENATEX(FILTER('Test Marks by Month','Test Marks by Month'[教科]=EARLIER('Test Marks by Month'[教科])),'Test Marks by Month'[最高得点者(名字)],", ")
黄色の部分で教科のフィルターをしています。これはFILTER関数と、ある列の前の行の値を参照する事ができるEARLIER関数を使っています。
FILTER関数は以前紹介しているので気になった方や、EARLIERなどで一個前の値などを使って次の値と比べたりしたい方はチェックして見てください!
まとめ
以上、「【Power BI DAX】初心者のためのCANCATENATEXの使い方」でした。次回はCONCATENATEX関数を使ってフィルターを使ってでた残ったアドレスに一斉にメールを送信する方法をやってみたいと思います。