0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Postgre SQL】CASE式のススメ #SELECT基本

Last updated at Posted at 2023-10-29

※これはミック(2018),『達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ」』[第2版],翔泳社のメモです。
私が特に役立つと思った事柄の書き起こしですので、もっと知りたい方は文献を参考にしてください(最後に記述)

CASE文の基本書式

CASE文基本書式
-- 単純CASE式
CASE sex 
    WHEN '1' THEN '男'
    WHEN '2' THEN '女'
ELSE 'その他' END

-- 検索CASE式
CASE
    WHEN sex = '1' THEN '男'
    WHEN sex = '2' THEN '女'
ELSE 'その他' END

どちらを使用するかはケースバイケースである。

CASE文は真になるWHEN句が存在した時点で即終了となり
残りのWHEN句は無視される。

WHEN句
-- 以下の場合、2行目のWHEN句は無視される
CASE WHEN col_1 IN ('a','b') THEN '1番'
     WHEN col_2 IN ('a') THEN '2番'
ELSE 'その他' END

CASE式はSELECT文でつけた別名をGROUP BYで指定できる

以下のような表を県名と男女別にまとめた結果を取得するとする。

■集計元

pref_name(県名) poplation(人口)
徳島 100
香川 200
愛媛 150
高知 200
福岡 300
佐賀 100
長崎 200
東京 400
群馬 50

■集計結果

地域 人口
四国 650
九州 600
その他 450

以下のSQLで取得できる。

CASE式のGROUP BY
-- 地域コードcolumn増やせばいいが、今回は無視
SELECT CASE pref_name
    WHEN '徳島' THEN '四国'
    WHEN '香川' THEN '四国'
    WHEN '愛媛' THEN '四国'
    WHEN '高知' THEN '四国'
    WHEN '福岡' THEN '九州'
    WHEN '佐賀' THEN '九州'
    WHEN '長崎' THEN '九州'
ELSE 'その他' END AS district,
SUM (poplation) AS poplation
FROM '集計元'
GROUP BY district;

UNIONよりCASE文

以下のような表を県名と男女別にまとめた結果を取得するとする。

■集計元

pref_name(県名) sex(性別) poplation(人口)
徳島 1 60
徳島 2 40
香川 1 100
香川 2 100
愛媛 1 100
愛媛 2 50
高知 1 100
高知 2 100
福岡 1 100
福岡 2 200
佐賀 1 20
佐賀 2 80
長崎 1 125
長崎 2 125
東京 1 250
東京 2 150

■集計結果

県名
徳島 60 40
香川 100 100
愛媛 100 50
高知 100 100
福岡 100 200
佐賀 20 80
長崎 125 125
東京 250 150

以下のクエリでも取得できるが、CASE文を使うとさらに効率よく取得可能

UNION
(
    SELECT pref_name,sum(poplation)
    FROM syuukei_table 
    WHERE sex = 1
    GROUP BY pref_name
)UNION (
    SELECT pref_name,sum(poplation) 
    FROM syuukei_table 
    WHERE sex = 2
    GROUP BY pref_name
)
CASE文を使用した例
SELECT pref_name,
	-- 男性
	SUM( CASE WHEN sex = 1 THEN poplation ELSE 0 END) AS cnt_m,
	-- 女性
	SUM( CASE WHEN sex = 2 THEN poplation ELSE 0 END) AS cnt_f
FROM syuukei_table
GROUP BY pref_name;

参考文献

ミック(2018),『達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ」』[第2版],翔泳社

Amazon
https://www.amazon.co.jp/%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6SQL%E5%BE%B9%E5%BA%95%E6%8C%87%E5%8D%97%E6%9B%B8-%E7%AC%AC2%E7%89%88-%E5%88%9D%E7%B4%9A%E8%80%85%E3%81%A7%E7%B5%82%E3%82%8F%E3%82%8A%E3%81%9F%E3%81%8F%E3%81%AA%E3%81%84%E3%81%82%E3%81%AA%E3%81%9F%E3%81%B8-CodeZine-BOOKS/dp/4798157821

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?