LoginSignup
1
0

More than 3 years have passed since last update.

SQLのCASE式を使ったテーブルの縦横変換

Posted at

使用DB

postgresql 12.2

やりたいこと

テーブルデータの縦持ちを横持ちにして集計する。

参考にしたのは、達人に学ぶSQL徹底指南書 第2版

サンプルデータとして、以下のような県ごとの男女比別人口があるテーブルを用いる。
sex = 1 は男で、2は女である。

pref_name sex population
徳島 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|100|100|100|360|855|
 |40|100| 50|100|290|845|

SQL

select
    case when sex = '1' then '男' else '女' end as 性別
    ,sum(case when pref_name = '徳島' then population else 0 end) as 徳島
    ,sum(case when pref_name = '香川' then population else 0 end) as 香川
    ,sum(case when pref_name = '愛媛' then population else 0 end) as 愛媛
    ,sum(case when pref_name = '高知' then population else 0 end) as 高知
    ,sum(
        case when pref_name = '徳島' then population
             when pref_name = '香川' then population
             when pref_name = '愛媛' then population
             when pref_name = '高知' then population
             else 0 end) as 四国
    ,sum(population) as すべて
from
    poptbl2
group by
    sex
order by
    sex
;

感想

SQLのCASE式は強力な機能だなと思った。

1
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
1
0