Power BIで、ある列に特定の文字列が含まれているか否かの情報を、別の列に記録する方法

# 前書き

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かそうでないかで簡単にフィルタをしたい」というのが実現したいイメージです。

![2019-09-22_21h49_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/f23df701-c39a-d3c5-dc93-ae82b6534247.png)


# やり方（基本）

主に使用するのは、CONTAINSSTRING関数です。

https://docs.microsoft.com/en-us/dax/containsstring-function-dax

まず、Power BI Desktopで、Excelから読み込んだテーブルの上で右クリックし、新しい列を追加します。

![2019-09-15_21h55_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/5b804a96-2c3c-5c47-5e57-41f46d0ff703.png)

列は最初は空っぽなので

![2019-09-15_22h05_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/d6a108ea-37f0-1247-fd24-4721eedbd7a6.png)

次の様に書きかえます

```
 Power BI = CONTAINSSTRING([タイトル],"Power BI")
```

これで、「Power BI」列が追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/58540075-3d83-ce2b-67b7-446d4e7518e8.png)

テーブルビューで結果を確認できます。

![2019-09-22_21h51_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/a7b5821f-4a22-4b86-0442-4446a4f13758.png)


この列情報を使うと、冒頭に乗せたような「Power BIがタイトルに含まれるか否か」で簡単にフィルタをすることが出来ます。

![2019-09-22_21h49_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/f23df701-c39a-d3c5-dc93-ae82b6534247.png)


# やり方（応用編）

これだけだと教えてもらった事そのままなので、自分なりに応用した内容を紹介します

## True/Falseの文字を変えたい

例えば、「Power BI」と「Others」にしたい場合、IF文を使って書きます。

```
Power BI = IF(CONTAINSSTRING([タイトル],"Power BI"), "Power BI", "Others")
```

![2019-09-22_21h59_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/728b8854-78ee-76b6-f0cd-d0ee8c329279.png)

## 表記ゆれに対応したい（IFを使う）

例えば、「Power BI」と「PowerBI」が混在していた場合、意図した結果が得られません。

![2019-09-22_22h05_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/18f5e405-b6c4-b41a-4a9e-03812477f8d9.png)


この場合、IF文をネストにして、「Power BI」の場合と「PowerBI」の場合の両方を判定します。

```

Power BI = IF(
		CONTAINSSTRING([タイトル],"Power BI"), "Power BI", 
		IF(
			CONTAINSSTRING([タイトル], "PowerBI"), "Power BI",
			 "Others"
			)
		)
```

![2019-09-22_22h06_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/61bc2c41-5b13-8185-bc16-77d1f0c58722.png)

## 表記ゆれに対応したい（SWITCHを使う）

IFをネストにするよりはSWITCHを使った方が綺麗に書けると聞いたのでSWITCHでも書いてみました。

* [SWITCH function \(DAX\) \- DAX \| Microsoft Docs](https://docs.microsoft.com/ja-jp/dax/switch-function-dax)

IFの分岐より明らかに見やすいですね。

```
Power BI = SWITCH(
		True(),
		CONTAINSSTRING([タイトル],"Power BI"), "Power BI",
		CONTAINSSTRING([タイトル],"PowerBI"), "Power BI",
		"Others"
		)
```

SWITCHはリファレンスを見るだけではイメージしづらいのですが、True()を最初に引数として書くやり方があるようです。

* [DAX \- The Diabolical Genius of “SWITCH TRUE” \- PowerPivotPro](https://powerpivotpro.com/2015/03/the-diabolical-genius-of-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"
		)
```

![2019-09-22_22h09_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/3c7846af-781f-9317-5068-bdb4ca6f913b.png)

# Power Queryで同様の事を実現する

今回のようなケースの場合、本来ならPower Queryで処理しておく方がいい、というアドバイスをもらったので、そちらのアプローチも試してみました。

クエリの編集で

![2019-09-17_22h18_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/d9d3dd0b-3ee5-390c-a0f0-3a5b43e343ca.png)

条件列を追加します

![2019-09-17_22h30_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/d7d46189-2033-d6a4-a6c0-401ea25b2edc.png)

「指定の値を含む」を条件として追加していきます。

![2019-09-22_22h10_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/065b09bc-9f5b-0f80-be9e-8a8493a55548.png)

Category列が出来ました。

![2019-09-22_22h11_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/34a4c912-73a1-468e-29f8-79d15a9eb319.png)

この追加した列を使って、DAXを使った時と同じように作ってあげれば出来上がり。

![2019-09-22_22h12_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/b1fa9576-e454-d95b-7b74-6c1dcda842fc.png)


# 後書き

今回のデータのように、「元データにカテゴリ列はないが、特定のカテゴリのものだけ頻繁にフィルタする」という場合には便利かと思います。

CONTAINSSTRING関数を使うことが分かれば簡単なのですが、うまくこの関数を見つけられなかったので記事に残してみました。同じ悩みを持つ方の参考になれば幸いです。

# 更新履歴
* 2019/09/17　　SWITCHを使った例と、Power Queryで処理する例を追記しました。
* 2019/09/22　　「PowerApps」の表記が誤って「Power Apps」になっていたので修正しました。（表記ゆれとしての「Power Apps」は残しています。）