おーみんブログ

C#, ASP.NET Core, Unityが大好きです。

【SQL 備忘録】行持ちから列持ちへの水平展開。

f:id:bookreadkun:20190818210718p:plain

おはようございます。おーみんです。

 

今回は備忘録としてSQLでの水平展開についてまとめようと思います。

 

参考文献

f:id:bookreadkun:20190818210925j:image

『達人に学ぶSQL徹底指南書 第2版』 ミック 著

 

行持ちから列持ちへの水平展開

以下のような各県の性別の人口を記録しているPopTbl2テーブルがあります。

f:id:bookreadkun:20190818211150p:plain

 

これを水平展開して

f:id:bookreadkun:20190818212006p:plain

というテーブルを作ることにしましょう。

その際のSQL文は以下になります。

------------------

select sex,
    sum(population) as total,
    sum(case when pref_name = '徳島'
        then population else 0 end) as Tokushima,
    sum(case when pref_name = '香川'
        then population else 0 end) as Kagawa,
    sum(case when pref_name = '愛媛'
        then population else 0 end) as Ehime,
    sum(case when pref_name = '高知'
        then population else 0 end) as Kouchi,
    sum(case when pref_name in ('徳島', '香川', '愛媛', '高知')
        then population else 0 end) as shikoku
from PopTbl2
group by sex;

------------------

 

sum(population) as total,

→すべての人口の合計

 

sum(case when pref_name = '徳島'
        then population else 0 end) as Tokushima,

徳島県の人口の合計

 

sum(case when pref_name = '香川'
        then population else 0 end) as Kagawa,

香川県の人口の合計

 

sum(case when pref_name = '愛媛'
        then population else 0 end) as Ehime,

愛媛県の人口の合計

 

sum(case when pref_name in ('徳島', '香川', '愛媛', '高知')
        then population else 0 end) as shikoku

→四国の人口の合計

 

group by sex;

→性別ごとにまとめる

 

といった感じです。

 

CASE式は使い方次第でかなり大きな武器になりそうなので使いこなせるようにしっかり勉強していこうと思います。