第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