見出し画像

Tableau Prep Tips集22 ーCASE関数ー

Japan Preppin Data FamメンバーのPrep Tips集をご紹介します。
今回は、CASE関数です。

以前、Tableau PrepのTips集 18 ー論理関数、条件式ー でも条件処理、分岐処理の概要をご紹介しましています。
今回は、SQLでも利用価値が高いとされているCASE関数を取り上げます。
Preppin' Data勉強会でmitamuuさんが利用した事例紹介で、具体的なCASE関数の利用方法やメリットをお伝えします。


Prep Tips (42) : CASE関数

(1)フィールドの値を利用

1) 指定するフィールドの文字列に従い、表示値を変える 2024W28

CASE関数の典型的な利用方法です。
CASEのあとに指定したフィールドの内容を、WHENの後で確認し、仕分けした結果に即してTHENで表示値を指定するものです。

CASE [Gender]
WHEN "men" THEN "Man"
WHEN "women" THEN "Woman"
END

CASE関数の典型的な利用例です: この例はREPLACE関数などでも対応出来ます

2) 条件により、データを抽出するフィールドを変える 2024W48

複数のテーブルやデータフィールドに分かれているデータから、条件に見合ったデータを取り出し新たなフィールドを作成する例になります。
Preppin' Data 2024W48を取り上げたブログ記事もご参照ください。

2024W49の課題では、4つのデータテーブルでそれぞれの条件で新たなデータフィールドを作成し、ユニオンで作成したフィールドを繋げて利用する方法が一般的です。
ユニオンの前に、新たなデータフィールドをそれぞれ作成する計算式を記述します。

4つのデータテーブルからデータフィールドを作成

これに対し、先にデータ接続で4つのデータテーブルをユニオンし、CASE関数を利用して必要な新たなフィールドを作成することが出来ます。

4つのデータテーブルを先にユニオンし、CASE関数を利用して新たなフィールドを作成

新たに作成する3つのデータフィールドは、下記のCASE関数を利用して作成をしています。フローがスッキリして、処理の経緯も分かりやすくなります。

[Ranking Field]
---
CASE [Sport]
WHEN 'NBA' THEN [WWins]
WHEN 'NFL' THEN [WWins]
WHEN 'Premier League' THEN [PtsPoints]
WHEN 'Rugby Aviva Premiership' THEN [PTS]
END

[Ranking Field] フィールドを作成するCASE関数 利用例

[Tie Breaker 1]
---
CASE [Sport]
WHEN 'NBA' THEN INT([GBGames behind])
WHEN 'NFL' THEN zn([PFPoints for]) - zn([PAPoints against])
WHEN 'Premier League' THEN [WWins]
WHEN 'Rugby Aviva Premiership' THEN [W]
END

[Tie Breaker 1] フィールドを作成するCASE関数 利用例

[Tie Breaker 2]
---
CASE [Sport]
WHEN 'NBA' THEN INT(SPLIT([ConfConference record],"-",1))
WHEN 'NFL' THEN [PFPoints for]
WHEN 'Premier League' THEN [GFGoals scored]
WHEN 'Rugby Aviva Premiership' THEN [PD]
END

[Tie Breaker 2] フィールドを作成するCASE関数 利用例

3)計算式から、入力する値を計算で変える 2024W44

WHENで条件式で判定させ、THENで判定に応じた値や計算結果を表示させます。
Preppin' Data2024W44では、前段で [Avg Days to Return] フィールドを作成し、CASE関数を用いて[Avg Days to Return] の大小関係を比較させ、出力させる  [Price] から値を計算させます。

[Return Price]
---
CASE TRUE
     WHEN [Avg Days to Return] < 60
          THEN [Price ]
     WHEN [Avg Days to Return] <= 100
          THEN [Price ] * 0.5
ELSE 0
END

[Avg Days to Return] の大小関係を比較させ、出力させる  [Price ] から値を計算

<補足>

この事例は、CASEの後にフィールド名を書かない手法になります。
WHEN 以下の条件式の判定をさせて、THEN 以下の処理をさせることで新たなフィールドを作る時などに利用出来ます。

Prepの仕様上、CASEの後に何も記載しないとエラーになってしまいます。
CASE TRUE と CASE の後に TRUE と記載しておくことで、計算が有効になります。

なお、上記の計算式については、次のIF関数を用いた計算式と同じ結果が得られます。

[Return Price]
---
IF [Avg Days to Return] <=60
          THEN [Price ]
ELSEIF [Avg Days to Return] <=100
          THEN [Price ] *0.5
ELSE 0
END

上記CASE関数を用いた計算式と同じ結果が得られるIF関数での計算式

4) 文字の内容で仕分け、CASE関数の入れ子利用 2024W28

複数ある [Table Names] の値から、それぞれの値に応じて、更に他のフィールド(下記例では [Gender] )の値に応じて最終的に表示する値を仕分ける設定をCASE関数の入れ子設定で実現しています。
 同様な入れ子の条件分岐はIF関数でも対応可能ですが、CASE関数の方が記載内容の識別性が良い感じです。

CASE [Table Names]
WHEN "Singles Champions" THEN
     CASE [Gender]
     WHEN "Man" THEN "Men's Singles"
     WHEN "Woman" THEN "Women's Singles"
     END
WHEN "Doubles Champions" THEN
     CASE [Gender]
     WHEN "Man" THEN "Men's Doubles"
     WHEN "Woman" THEN "Women's Doubles"
     END
ELSE "Mixed Doubles"
END

入れ子にしたCASE関数での条件分岐 利用例


(2)条件式を利用 : CASEの後に条件式

CASEの後に、フィールドの指定だけでなく条件式を入れ、WHENで条件分岐の結果を確認してTHENで結果に従う値を表示させることが出来ます。
同様な条件式での分岐はIF関数でも作成可能ですが、IF関数では条件式の内容を重複して記載する必要があります。CASE関数は、条件式の記載が1回で済むので、認識性の向上を含めシンプルな式の記載となります。

5)文字列に含まれる値に対し、結果を仕分けて表示させる 2024W42

フィールド内に含まれる文字の内容に応じ、最終的に表示させる値を指定する方法です。
IF関数を用いた [Week] に含まれる3種の文字列に対する、条件分岐での仕分け例は次の通りです。

IF CONTAINS([Week],'Semi') THEN 'Semi Final'
ELSEIF CONTAINS([Week],''Quarter') THEN 'Quarter Final'
ELSEIF CONTAINS([Week],,'Final') THEN 'Final
ELSE '' END

IF関数を用いた条件式の例

これをCASE関数を用いた例が下記になります。
IF関数で重複して記載していた CONTAINS([Week],'Semi') の部分が、CASEの後の式1回のみの記載で記載が完了しています。

CASE REGEXP_EXTRACT([Week], '(?i)(final|semi|quarter)')
WHEN 'Semi' THEN 'Semi Final'
WHEN 'Quarter' THEN 'Quarter Final'
WHEN 'Final' THEN 'Final'
END

CASE関数を用いた条件式の例

6)計算式の途中で利用、条件により利用する数値を変える 2024W39

日付の処理で曜日に関する応用例です。
CASEの後の条件式で日付に関わるフィールドの値で曜日を示す数値を表示させています。
下記の例では、週末(土日)に対し日付の付与日数を調整する計算式内でCASE関数を有効に利用しています。

2 -
      (CASE DATEPART('weekday',[Engagement Start Date])
           WHEN 1 THEN 1    //
           WHEN 2 THEN 0
           WHEN 3 THEN 0
           WHEN 4 THEN 0
           WHEN 5 THEN 0
           WHEN 6 THEN 0
           WHEN 7 THEN 1    //
END
+
     CASE DATEPART('weekday',[Engagement End Date])
           WHEN 1 THEN 1    //
           WHEN 2 THEN 0
           WHEN 3 THEN 0
           WHEN 4 THEN 0
           WHEN 5 THEN 0
           WHEN 6 THEN 0
           WHEN 7 THEN 1    //
END)

土日にフラグを作り、日数の計算に利用している

7)条件により利用する数値を変える 2024W36

サッカー試合の得失点差がプラス(1)かマイナス(−1)か、または同点(0)かで試合の勝ち点を表示させるCASE関数の応用例です。

CASE SIGN([Goal Difference (RT)])
WHEN 1 THEN 3
WHEN 0 THEN 1
WHEN -1 THEN 0
END

SIGN関数を用いてデータの正負を確認し、CASEの条件分岐を利用する例

8)文字列の数値を抜き取り、その結果で利用する値を仕分ける 2024W33

ブール値を判別する関数をCASEの後に記載し、真偽値に従い表示させる値を決める利用例です。
例では、[Term] フィールドに1〜9の数値データが含まれていれば TRUE と判断し  'term' を返す、そうでなければ 'holiday' を返す関数式です。

CASE REGEXP_MATCH([Term],'[1-9]')
WHEN TRUE THEN 'term'
WHEN FALSE THEN 'holiday'
END

1〜9の数値有無で、値を決める条件式の例

9)指定文字の位置から、出力を変える 2024W25

日付の年月日 並び順を調整する利用例です。
日付は国によって年月日の並び順が異なるケースが多く、データ接続時の読み込み方で並び順がおかしくなるケースが散見されます。
この例は、データソースで / で年月日が区切られている値から、利用しているPrep(日本語版)で認識出来る並び順に揃える計算式の例になります。

データ接続時の日付データ例
(文字列型で年月日の並び順がまちまち)
CASE関数を利用して年月日の並び順を整理
(上の例では、日付型に変更した後のデータです)

CASE FINDNTH([Date Received],"/",1)
WHEN 2 THEN DATE(DATEPARSE("MM/dd/yyyy",[Date Received]))
WHEN 3 THEN DATE(DATEPARSE("MM/dd/yyyy",[Date Received]))
WHEN 5 THEN DATE(DATEPARSE("yyyy/dd/MM",[Date Received]))
END

CASE関数を利用して年月日の並び順を整理する関数式

まとめ

今回は、条件式で利用価値の高いCASE関数を取り上げました。

IF関数、IIF関数(YesとNoの2択)も条件式での利用機会が多い関数ですが、CASE関数の方が共通データ(フィールドや関数式など)を1回の記載で利用出来ることなど、作業性や認識性の向上が図りやすくなります。

また、CASE関数はSQLでの利用機会は多く、データベースの操作という観点でも各操作の理解度が深まり、スキルアップが図れるメリットがあります。

Prepの利用で、是非使いこなしたい関数の1つです。


いいなと思ったら応援しよう!