8-4 アドホックな集計キー
テーブルの集計をしたいが、集計キー(カラム)が存在とする。その時に場当たり的に集計キーを追加するのはグレーノウハウ
例
都道府県テーブルから地方別の人口を集計したい
table:都道府県
県コード 県名 人口(万人)
01 北海道 550
02 青森 130
03 岩手 133
...... ...... ......
37 香川 99
⬇️
table:都道府県
県コード 県名 人口(万人) 地方コード
01 北海道 550 01
02 青森 130 01
03 岩手 133 01
...... ...... ...... ......
37 香川 99 03
これで解決はできるが、こういった場当たり的なことをすると、キーが次々に追加されパフォーマンスが落ちていく。なぜなら集計対象のテーブルは大規模であることが多いから
解決策1️⃣
テーブルを分離する
例
table:都道府県・地方
県コード 地方コード
01 01
02 01
03 01
...... ......
37 03
メリット
メンテナンスが容易になる
デメリット
SQL結合が必要になるため、パフォーマンス問題の解決策にはなりづらい
解決策2️⃣
SQLのビューを使う
オリジナルのテーブルには変更を加えずに、用意したビューで集計ができる
ビューは、実質的にオリジナルのテーブルにアクセスしているのと変わらないため、パフォーマンスを劣化させない
解決策3️⃣
集計キーをGROUP BY句の中で作る
例
code:sql
SELECT CASE WHEN 県コード IN ('01', '02', '03') THEN '01'
WHEN 県コード IN ('22', '23', '24') THEN '02'
WHEN 県コード IN ('36', '37') THEN '31'
ELSE NULL END AS 地方コード、
SUM(人口(万人))
FROM 都道府県
GROUP BY CASE WHEN 県コード IN('01', '02', '03') THEN '01'
WHEN 県コード IN('22', '23', 24') THEN '02'
WHEN 県コード IN ('36', '37') THEN '03'
ELSE NULL END;