主に集計タイプの計算で大活躍するgroupbyについて。
主な用途は集計とカット。特にcase式と連動した集計はかなり使える
例 nameとageで構成されたテーブルがあるとして、年代ごとの人数を出したいときなど(例えば未成年,20~69,70以上に分けたいときは下記のSQLで一発)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
SELECT CASE WHEN age < 20 THEN '子供' WHEN age between 20 and 69 THEN '大人' WHEN age > 70 THEN '老人' ELSE NULL END as age_seg, COUNT(*) , FROM Persons GROUP BY CASE WHEN age < 20 THEN '子供' WHEN age between 20 and 69 THEN '大人' WHEN age > 70 THEN '老人' ELSE NULL END |
注意点としてグルーピングのキーをgroupbyとセレクトキーの両方に使う。
細かい構文上の注意点としてはgroupbyのcase文にasをつけないこと。※SELECTで定義しておけばGROUP BY age_segなどと書くこともできるようですが、どちらかというと非推奨。
PARTITION BY句を使うと集計せずにデータを出すことができ、なおかつソートまでできる。ただしMySQLにはない模様。
http://mickindex.sakura.ne.jp/database/db_support_sinan.html
使用例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
SELECT name, age, CASE WHEN age < 20 THEN '子供' WHEN age between 20 and 70 THEN '大人' WHEN age > 70 THEN '老人' ELSE NULL END AS age_seg , RANK() OVER(PARTITION BY CASE WHEN age < 20 THEN '子供' WHEN age between 20 and 70 THEN '大人' WHEN age > 70 THEN '老人' ELSE NULL END ORDER BY age ) AS age_rank_in_class FROM Persons ORDER BY age_seg , age_rank_in_class |
name | age | age_seg | age_rank_in_class
山田 | 15 | 子供 | 1
田中 | 19 | 子供 | 2
渡邊 | 23 | 大人 | 1
佐藤 | 45 | 大人 | 2
鈴木 | 74 | 老人 | 1
参考文献
SQL実践入門