[SQL] case when文

公開日: : DB, SQL , , , , ,

select結果を条件で振り分けるSQL

通常はjoinとかwhere句で振り分けたりしますが、
select結果に対して振り分けると処理が高速になったりします。

例)以下の履歴テーブルに対して、月毎に500円以上の明細をカウントする。


      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

まずは普通にやってみます。
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実行結果は両方とも以下のようになります。


        month        | cnt
---------------------+-----
 2014-05-01 00:00:00 |   4
 2014-06-01 00:00:00 |   1

ちなみに、date_truncはPostgreSQL独自ですので、MySQLとOracleでやる場合には以下になります。
●MySQL
 DATE_FORMAT(T1.date_time, ‘%Y-%m-01′)
●Oracle
 trunc(T1.date_time, ‘mm’)

スポンサードリンク

関連記事

no image

[SQLServer] 当日0時や月初0時の取得方法

当日0時や月初0時の取得方法です。 当日0時 DATEADD関数の2番目の引数にDATEDI

記事を読む

no image

[PostgreSQL][SQL] 日付関連

●interval tbl_Aから、tbl_Bの日付で7日前~現在に当てはまるレコードを抽出す

記事を読む

no image

[SQL] primary keyの追加・削除

テーブル作成後にprimary keyを付与する方法です。 ALTER TABLE テーブ

記事を読む

no image

[SQL] 割合を計算するときの定石(割られる数をCASTする)

なんとか率などの割合を計算するときのメモ。 割られるほうの数値を浮動小数点にCASTする 割られ

記事を読む

no image

[PostgreSQL] よく使う基本コマンド

PostgreSQLでpsqlのコマンド入力をする場合の一般的SQL以外のコマンドを列挙します。

記事を読む

no image

[SQL] 副問い合わせのin句に指定できるワードの数について

副問い合わせのin句に指定できるワードの数について ●Oracle 1000個が上限のようで

記事を読む

no image

[SQLServer] SQLServerでSplitを実装!

SQLServerでSplitを実装してみます。 最新のSQLServerには組み込み関数があ

記事を読む

no image

[PostgreSQL][SQL] csvファイルのインポート

PostgreSQLでcsvファイルをインポートする際の方法を解説します。 例題として、以下の

記事を読む

no image

[SQL][集計関数] 行数をカウントするcount関数の解説

count関数について説明します。 count関数は、グループ化した単位での件数をカウントしま

記事を読む

no image

[PostgreSQL][SQL] 文字列関連

PostgreSQLで文字列の処理をしたい場合のTipsをご紹介します。 ①文字列連結

記事を読む

スポンサードリンク

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <img localsrc="" alt="">

スポンサードリンク

no image
[SQLServer] SQLServerでSplitを実装!

SQLServerでSplitを実装してみます。 最新のSQLS

no image
[SQLServer] 当日0時や月初0時の取得方法

当日0時や月初0時の取得方法です。 当日0時 DATEADD関

no image
[PostgreSQL] csvでSQL結果を出力する方法(psqlコマンド)

SQLエディタ、接続ツールなどを使うと簡単に行える CSVファイ

no image
[bash] ファイルの中身を1行ずつ処理するループ処理(while文)

ファイルの中身を1行ずつ処理したい場合の処理です。 ファイル名を

no image
[bash] grep・egrepコマンド

基本パターン ファイル中の文字列を検索 $ grep '[検索

→もっと見る

  • 2017年5月
    « 3月    
    1234567
    891011121314
    15161718192021
    22232425262728
    293031  
PAGE TOP ↑