[SQL] case when文
select結果を条件で振り分けるSQL
通常はjoinとかwhere句で振り分けたりしますが、
select結果に対して振り分けると処理が高速になったりします。
例)以下の履歴テーブルに対して、月毎に500円以上の明細をカウントする。
1 2 3 4 5 6 7 8 9 10 11 12 |
<tt> date_time | id | val ---------------------+----+------ 2014-05-05 00:00:00 | 1 | 500 2014-05-13 00:00:00 | 2 | 1500 2014-05-14 00:00:00 | 2 | 200 2014-05-20 00:00:00 | 1 | 800 2014-05-23 00:00:00 | 1 | 100 2014-05-30 00:00:00 | 4 | 600 2014-06-01 00:00:00 | 1 | 600 2014-06-05 00:00:00 | 5 | 50 </tt> |
まずは普通にやってみます。
500円以上の明細にwhere句で絞ってから、group byでサマリしてcountをとっています。
select date_trunc('month', V1.date_time ) as month , count(*) as cnt from ( select * from public.履歴テーブル T1 where T1.val >= 500 ) V1 group by month
これをcase when文でやると以下のようになります。
case whenで「500円以上であれば1」という条件にしてsum関数で合計しています。
SQLのネストが1つ少なくなってシンプルな構成を実現できています。
select date_trunc('month', T1.date_time ) as month , sum( case when T1.val >= 500 then 1 else 0 end ) as cnt from public.履歴テーブル T1 group by month
SQL実行結果は両方とも以下のようになります。
1 2 3 4 5 6 |
<tt> month | cnt ---------------------+----- 2014-05-01 00:00:00 | 4 2014-06-01 00:00:00 | 1 </tt> |
ちなみに、date_truncはPostgreSQL独自ですので、MySQLとOracleでやる場合には以下になります。
●MySQL
DATE_FORMAT(T1.date_time, '%Y-%m-01')
●Oracle
trunc(T1.date_time, 'mm')
スポンサードリンク
関連記事
-
[SQLServer] 当日0時や月初0時の取得方法
当日0時や月初0時の取得方法です。 当日0時 DATEADD関数の2番目の引数にDATEDI
-
[PostgreSQL][SQL] 文字列関連
PostgreSQLで文字列の処理をしたい場合のTipsをご紹介します。 ①文字列連結
-
[SQL] 割合を計算するときの定石(割られる数をCASTする)
なんとか率などの割合を計算するときのメモ。 割られるほうの数値を浮動小数点にCASTする 割られ
-
[PostgreSQL][SQL] csvファイルのインポート
PostgreSQLでcsvファイルをインポートする際の方法を解説します。 例題として、以下の
-
[SQLServer] 日付の加算・減算
SQLServerでの日付の加算・減算方法をまとめます。 現在時刻の取得方法 現在時刻は「GET
-
[PostgreSQL] csvでSQL結果を出力する方法(psqlコマンド)
SQLエディタ、接続ツールなどを使うと簡単に行える CSVファイルでの出力 について、コ
-
[SQL][集計関数] 行数をカウントするcount関数の解説
count関数について説明します。 count関数は、グループ化した単位での件数をカウントしま
-
[PostgreSQL][SQL] 日付関連
●interval tbl_Aから、tbl_Bの日付で7日前~現在に当てはまるレコードを抽出す
-
[RDB][SQL] JOINについて
JOINについて説明します。 まず、以下の2つのテーブルがあります。 簡単なテーブルなので、
-
[PostgreSQL] よく使う基本コマンド
PostgreSQLでpsqlのコマンド入力をする場合の一般的SQL以外のコマンドを列挙します。