前書き
Power BIで、ある列に特定の文字列が含まれているかどうかを判定し、別の列にTrue/Falseなどで記録をしたかったのですが、自分でうまくいかず、コミュニティに相談したらあっという間に解決しました。
ただ、質問としてはまれにあるようなので、解決法と、自分なりの応用テクニックをまとめてみました。
やりたいことのイメージ
Excelでこのようなテーブルがあったとします。
タイトル | 開催日 | 場所 |
---|---|---|
Power BI 初級 | 1月1日 | 東京 |
Flow 初級 | 2月2日 | 大阪 |
PowerApps 初級 | 3月3日 | 名古屋 |
Power BI 中級 | 4月4日 | 大阪 |
Flow 中級 | 5月5日 | 名古屋 |
PowerApps 中級 | 6月6日 | 東京 |
Power BI 上級 | 7月7日 | 名古屋 |
Flow 上級 | 8月8日 | 東京 |
PowerApps 上級 | 9月9日 | 大阪 |
このようなデータをもとにPower BIで、「Power BIかそうでないかで簡単にフィルタをしたい」というのが実現したいイメージです。
やり方(基本)
主に使用するのは、CONTAINSSTRING関数です。
まず、Power BI Desktopで、Excelから読み込んだテーブルの上で右クリックし、新しい列を追加します。
列は最初は空っぽなので
次の様に書きかえます
Power BI = CONTAINSSTRING([タイトル],"Power BI")
これで、「Power BI」列が追加されます。
テーブルビューで結果を確認できます。
この列情報を使うと、冒頭に乗せたような「Power BIがタイトルに含まれるか否か」で簡単にフィルタをすることが出来ます。
やり方(応用編)
これだけだと教えてもらった事そのままなので、自分なりに応用した内容を紹介します
True/Falseの文字を変えたい
例えば、「Power BI」と「Others」にしたい場合、IF文を使って書きます。
Power BI = IF(CONTAINSSTRING([タイトル],"Power BI"), "Power BI", "Others")
表記ゆれに対応したい(IFを使う)
例えば、「Power BI」と「PowerBI」が混在していた場合、意図した結果が得られません。
この場合、IF文をネストにして、「Power BI」の場合と「PowerBI」の場合の両方を判定します。
Power BI = IF(
CONTAINSSTRING([タイトル],"Power BI"), "Power BI",
IF(
CONTAINSSTRING([タイトル], "PowerBI"), "Power BI",
"Others"
)
)
表記ゆれに対応したい(SWITCHを使う)
IFをネストにするよりはSWITCHを使った方が綺麗に書けると聞いたのでSWITCHでも書いてみました。
IFの分岐より明らかに見やすいですね。
Power BI = SWITCH(
True(),
CONTAINSSTRING([タイトル],"Power BI"), "Power BI",
CONTAINSSTRING([タイトル],"PowerBI"), "Power BI",
"Others"
)
SWITCHはリファレンスを見るだけではイメージしづらいのですが、True()を最初に引数として書くやり方があるようです。
複数の分類を行いたい
「Power BI」だけでなく「PowerApps」も分類してフィルタしたい場合も対応できます。これもSWITCHを使います。
(元データを少しいじって、「PowerApps」の表記ゆれとして「Power Apps」を追加しています)
Power BI = SWITCH(
True(),
CONTAINSSTRING([タイトル],"Power BI"), "Power BI",
CONTAINSSTRING([タイトル],"PowerBI"), "Power BI",
CONTAINSSTRING([タイトル],"PowerApps"), "PowerApps",
CONTAINSSTRING([タイトル],"Power Apps"), "PowerApps",
"Others"
)
Power Queryで同様の事を実現する
今回のようなケースの場合、本来ならPower Queryで処理しておく方がいい、というアドバイスをもらったので、そちらのアプローチも試してみました。
クエリの編集で
条件列を追加します
「指定の値を含む」を条件として追加していきます。
Category列が出来ました。
この追加した列を使って、DAXを使った時と同じように作ってあげれば出来上がり。
後書き
今回のデータのように、「元データにカテゴリ列はないが、特定のカテゴリのものだけ頻繁にフィルタする」という場合には便利かと思います。
CONTAINSSTRING関数を使うことが分かれば簡単なのですが、うまくこの関数を見つけられなかったので記事に残してみました。同じ悩みを持つ方の参考になれば幸いです。
更新履歴
- 2019/09/17 SWITCHを使った例と、Power Queryで処理する例を追記しました。
- 2019/09/22 「PowerApps」の表記が誤って「Power Apps」になっていたので修正しました。(表記ゆれとしての「Power Apps」は残しています。)