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

やり方(基本)

主に使用するのは、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」は残しています。)