【Tableau関数】CASEの使い方をわかりやすく解説!VLOOKUP的作業もできる!

今回はCASE関数を解説します。
指定値のパターン分岐ができ、値に応じた結果を返してくれます。

目次

値に応じたパターン分岐を実現

CASEは論理関数の1つで、パターン分岐を実現する関数です。
早速使い方を見ていきましょう。

完全一致による分岐

//例
CASE [都道府県]
WHEN "東京都"
THEN "関東"
WHEN "大阪府"
THEN "関西" //以下WHEN THENを繰り返すことで条件追加できます。
ELSE "その他" //全条件に一致しない場合の処理を追加できます。
END

CASE [判別したい項目] WHEN 条件1 THEN 結果1 WHEN 条件2 THEN 結果2 END
↑のように入力することで、条件値と一致しているか確認でき、設定した値を返すことができます。

基本的には完全一致です。
部分一致は一応可能なので、以下で解説します。

リスト判定や部分一致、範囲指定など他関数を組み合わせた方法

IN関数を組み合わせたリスト判定

上記の例でいけば、関東は東京都だけでなく、埼玉県や神奈川県なども条件に一致します。
この時、1個1個WHEN THENで追加するのは面倒です。
IN関数を使いましょう。

//例
CASE [都道府県]
WHEN IN(東京都,埼玉県,神奈川県)
THEN "関東"
WHEN "大阪府"
THEN "関西"
END

完全一致ではなく部分一致で判定

CASEは完全一致が前提で、部分一致はできません。
なので正規表現を使って無理やり部分一致の同じ効果を作るしかありません。

//例
CASE [都道府県]
WHEN REGEXP_EXTRACT([都道府県],"(.*都$)") //文字列が都で終わる場合に値を抜き出す

THEN "都グループ"
WHEN REGEXP_EXTRACT([都道府県],"(.*県$)") //文字列が県で終わる場合に値を抜き出す
THEN "県グループ"
ELSE "その他"
END

原理的には、REGEXP_EXTRACTを使い部分一致した場合に、その値をそのまま抜き出しています。
例えば [都道府県]の値が”東京都”であった場合の流れを見ると

  1. 1つ目の正規表現では都で終わる文字列を指定しているため、”東京都”は一致する
  2. REGEXP_EXTRACTは正規表現に一致したものを抜き出すため、そのまま”東京都”を返す
  3. WHENの条件が東京都になる
  4. CASEの指定値も東京都なので完全一致
  5. “都グループ”が返される

このようになります。
完全一致ですが、部分一致と同機能です。

範囲指定で判定

ExcelVBAなどだと、Toで範囲指定ができますがTableauはそれもできません。
REGEXP_EXTRACTを使って同機能を実現してみましょう。

//例
CASE STR([人口])
WHEN REGEXP_EXTRACT(STR([人口]),"([1-9][0-9][0-9][0-9][0-9][0-9]|[2-9][0-9][0-9][0-9][0-9])")
THEN "20000人以上"
WHEN REGEXP_EXTRACT(STR([人口]),"(1[0-9][0-9][0-9][0-9])")
THEN "10000~19999人"
WHEN REGEXP_EXTRACT(STR([人口]),"([5-9][0-9][0-9][0-9])")
THEN "5000~9999人"
ELSE "4999人以下"
END

上記は人口が100万に満たない場合のみ使える範囲数式です。
説明が難しいので、別途正規表現についての解説か、REGEXP_EXTRACTの解説で確認をお願いします。
↓リンク

Excelマスタの代用として使う(ほぼVLOOKUPです)

保守的にどうかなとか、負荷的にどうかなと思いますが、CASEをマスタと同じように使うことができます。
結構便利です。

保管はExcelで計算はTableauで

まずExcelでマスタを作成します。
↓の関数をExcelに追加してください。(想定はA列にメインキー、BCD列にあてはめたい文字)

="WHEN '"&A2&"'THEN '"&TEXTJOIN("∥",FALSE,B2:D2)&"'"

↓みたいな感じです。

関数列をコピーして計算フィールドを作りましょう。
↓みたいでOKです。

//フィールド名はマスタにします

CASE [市町村] //最初と最後だけ付け加える

    WHEN '福井市'THEN '福井県∥258854∥536.42'
    WHEN '敦賀市'THEN '福井県∥63050∥251.47'
    WHEN '小浜市'THEN '福井県∥28372∥233.11'
    WHEN '大野市'THEN '福井県∥30044∥872.43'
    WHEN '勝山市'THEN '福井県∥21451∥253.88'
    WHEN '鯖江市'THEN '福井県∥68118∥84.59'
    WHEN 'あわら市'THEN '福井県∥26762∥116.98'
    WHEN '越前市'THEN '福井県∥79591∥230.7'
    WHEN '坂井市'THEN '福井県∥87153∥209.67'
    WHEN '永平寺町'THEN '福井県∥18698∥94.43'
    WHEN '池田町'THEN '福井県∥2286∥371.79'
    WHEN '南越前町'THEN '福井県∥9605∥343.69'
    WHEN '越前町'THEN '福井県∥19529∥153.15'
    WHEN '美浜町'THEN '福井県∥8904∥152.35'
    WHEN '高浜町'THEN '福井県∥9986∥72.4'
    WHEN 'おおい町'THEN '福井県∥7706∥212.19'
    WHEN '若狭町'THEN '福井県∥13467∥178.49'

END //最初と最後だけ付け加える、ELSEはお好みで

↓のデータに追加します。

あとはSPLITで取り出すだけ

試しに面積を取り出してみましょう。

//フィル―ド名は面積にします。
FLOAT( //面積は小数点ありなのでFLOAT、整数ならINT
  SPLIT([マスタ],"∥",3) //区切り文字は"∥"で面積の位置は3番目です
)

たぶんこの方式で大半のデータ作成上の問題をごり押せます。
しかし、属人化への大きな一歩でもありますので、ほどほどがおすすめです。
基本的にはPrepもしくはTableauserverへの出力前に解消できるようにしましょう。

おわり

お疲れ様です。

Comment

コメントする

目次