SQLのCASE文をExcelのIF文で表現する


自分で書いたSQL文を自分でテストするときに、別途同じテストデータでExcel使って作っておいたアンサー値と、実際にSQLを実行して取り出してきた値とを比較するってことがあります。

出来る先輩は簡単におっしゃるんだ。
「エクセルで答え作っといて!それと比べれば良いから!」

「はい、わかりました(エクセルでどうやって作るねん)」

エクセルのやり方を先輩に質問するのはさすがに忍びないので、自分でなんとかします。今回はCASE文と同じ処理を表現します。IF文の入れ子でやります。

SQLのCASE文で付与した値が、例えばGROUP BYのキーになっていたりする場合、エクセルで表現するにはIF条件分岐で作業列を作ってから、ピボットするなりして模擬実行結果を作ります。

SQLのCASE文例

例えば、
「学生番号, 名前, ……」のCSVファイルがあります。

▼テーブル名:KOHUN_ASUKA_CLASS

学生番号(列名:STUDENT_ID) 名前(列名:STUDENT_NAME)
0010 卑弥呼
0011 蘇我馬子
0012 聖徳太子
0013 小野妹子
0014 中臣鎌足
0015 中大兄皇子
0016 天武天皇
0017 仁徳天皇

修学旅行に行くので、1班・2班に分けたいと思います。
学生番号が0010~0013が1班、
0014~0017なら2班にすることにしました(列名:GROUP_NUM)

CASE.sql
SELECT
    STUDENT_ID,
    STUDENT_NAME,
    CASE
        WHEN STUDENT_ID BETWEEN '0010' AND '0013' THEN '1'
        WHEN STUDENT_ID BETWEEN '0014' AND '0017' THEN '2'
        ELSE '0'
    END AS GROUP_NUM
FROM
    KOHUN_ASUKA_CLASS

▼実行結果

STUDENT_ID STUDENT_NAME GROUP_NUM
0010 卑弥呼   1  
0011 蘇我馬子 1  
0012 聖徳太子 1  
0013 小野妹子 1  
0014 中臣鎌足 2  
0015 中大兄皇子 2  
0016 天武天皇 2  
0017 仁徳天皇 2  

Excelの条件分岐でCASEと同じ事をする

ExcelのA列にSTUDENT_ID, B列にSTUDENT_NAME, C列にGROUP_NUMを出力します。
C2に下の関数を書いて、後は下までオートで埋めれば完成です。

IF.xlsx
# GROUP_NUM
=IF(AND(0010<=A2,A2<=0013),"1"
    ,IF(AND(0014<=A2,A2<=0017),"2","0")
    )

※Excel自体のセル表示形式(数値、文字列等)がズレていると、求める結果が得られない場合があるので、そこは調整してください。

IF関数の引数_Excel
=IF(条件式, 真の場合, 偽の場合)

条件がもっと多い時は?

条件が増えても、入れ子になった「偽の場合」に随時追加していけばOK。

学生がもっと多くて、こうしたい時、
0010~0013→1班
0014~0017→2班
0018~0021→3班
0022~0025→4班

IF_2.xlsx
# GROUP_NUM
=IF(AND(0010<=A2,A2<=0013),"1"
    ,IF(AND(0014<=A2,A2<=0017),"2"
        ,IF(AND(0018<=A2,A2<=0021),"3"
            ,IF(AND(0022<=A2,A2<=0025),"4","0")
           )
       )
   )

以上