PowerBIでVLOOKUP的なことをしよう!
PowerBIでVLOOKUP的なことをしようとしたんですが、VLOOKUP関数は実装されていないので困ってしまいました。PowerBIの使い方として、そもそももしかしたらPowerBI上でVLOOKUP的なことをするんじゃなく、そういうのはExcelなんかでデータ整形しろって話かもしれませんが、他のソフトではきだしてきたCSVとかExcelやPythonなんかでいじることなくそのまま入れたいじゃないですか。面倒だし。
ということで、無理やりVLOOKUP的なことをしてみようというのが今回の趣旨です。
前提
テーブル(rawdata)には、date列(日付)、category列(カテゴリ)、center列(センター)、time列(時刻)、item列(商品名)が含まれているものとします。date列は「8月1日」、category列は「オススメ飲食物」、center列は「山形」、time列は「11:00」、item列は「玉こんにゃくゴルゴンゾーラ」みたいな。
時刻ごとに入っている元データから、「オススメ飲食物」だけ抽出して、一日ごとでまとめて(Visualizeではなくテーブルとして)表(Day)にしたいとしましょう。
条件で検索した結果が一つのみの場合
その日、そのセンターでの「オススメ飲食物」は必ず一種類と決まっている場合について。
この場合はLOOKUPVALUE関数を使います。
LOOKUPVALUE( <result_columnName>, <search_columnName>, <search_value>[, <search_columnName>, <search_value>]…)
まずはDayテーブルの商品名以外の部分をそろえるとします。
この辺の作り方は、【PowerBI】存在しない欠損データにダミーデータを入れるを参考にしてみてください。
商品名以外の部分が準備できたら、「モデリング」から「列の追加」をしてitem列をつくっていきます。
= LOOKUPVALUE(rawdata[item], Day[date], rawdata[date], Day[category], 'オススメ飲食物', Day[center], rawdata[center])
みたいな感じ。ちなみに、このすべての条件に一致するものがなければ空白が返されます。ただし、この検索条件に当てはまるものがいくつかある場合にはErrorとなってしまいます。そんな時には以下を使いましょう。
条件で検索した結果が複数存在する場合
その日、そのセンターでの「オススメ飲食物」は基本的に一種類だけど、たまに2種類以上出している時があるという場合。そして、それはあくまでも例外的なものであって厳密に商品名で分けなくてよいものの、Error値ではなく何らかの商品名で出してほしい場合。
あんまりないかな?
この場合はCALCULATE関数とFIRSTNONBLANK関数、FILTER関数を使えばうまくいきます。
こんな感じです。
item = CALCULATE(FIRSTNONBLANK(rawdata[item],1),
FILTER(ALL(rawdata[date]),rawdata[date]=Day[date]),
FILTER(ALL(rawdata[center]),rawdata[center]=Day[center]),
FILTER(ALL(rawdata[category]),rawdata[category]='オススメ飲食物'))
原理は簡単。
CALCULATEとALL、FILTERをつかって、元の列から条件に適合するデータを抜き出していきます。そして、その中からFIRSTNONBLANK関数で空白でないデータを取り出してやっています。どちらかといえばこっちのほうがVLOOKUP関数には近いですね。ただ、先に書いたように検索結果が複数あるのに一つだけ無理やり出すのもどうかと思いますし、あくまでもなんちゃってということで。
厳密に出したい場合はアプローチがまったく変わってきます。
以上になります!