第105回 Oracleのお勉強 CASE式とDECODEに慣れる
GROUP BYするときに、countだけでは、うまく集計できないことが多々ある。
それはもう結構ある。
そういうときは、sumとCASEもしくは、sumとDECODEである。
CASEとDECODEの違いは、
CASE と DECODE 関数の違い - オラクル・Oracleをマスターするための基本と仕組み
を参考にしていただくとして、ここでは書式に慣れたいと思う。
リンク先で
引用:
DECODE( expr, comparison_expr1, ret_expr1, comparison_expr2, ret_expr2, default_expr ); CASE expr WHEN comparison_expr1 THEN ret_expr1 WHEN comparison_expr2 THEN ret_expr2 ELSE default_expr END
と とてもわかりやすく書き換えられていましたので、大変助かりました。
DECODE( 比較対象の値が, この値なら, ココの値にする, この値なら, ココの値にする, デフォルト ); CASE 比較対象の値が WHEN この値なら THEN ココの値にする WHEN この値なら THEN ココの値にする ELSE デフォルト END
こんな感じに読めるわけですね。
sum と DECODEを使う
前回の
SQL> select 2 to_char(d_create, 'YYYY/MM/DD HH:MI:SS') 日付, 3 c_status ステータス 4 from 5 t_group_date 6 ; 日付 ステータス -------------------------------------- -------------------- 2009/01/01 10:10:10 5 2009/01/01 10:10:11 5 2009/01/02 10:10:10 5 2009/01/02 10:10:11 0
を使って、
「日付ごとに、ステータスが5のものの件数を数える」
SQL> select 2 to_char(d_create, 'YYYY/MM/DD') 日付, 3 sum( decode ( c_status, 4 5, 1, 5 0 6 ) 7 ) 件数 8 from 9 t_group_date 10 group by 11 to_char(d_create, 'YYYY/MM/DD') 12 order by 13 to_char(d_create, 'YYYY/MM/DD') 14 ; 日付 件数 -------------------- ---------- 2009/01/01 2 2009/01/02 1