2024
October
17
GROUP BYで列番号を使用する書き方
postgresqlでCASE文や計算式を使ったカラムに対して集計やソートをしたい場合があるかと思います。
その場合はSELECT句で書いた式をそのままGROUP BY句やORDER BY句に書くことになるかと思います。
そういった時に便利な機能を紹介します。
テーブル
氏名 | 点数 |
麻倉 | 100 |
雨宮 | 88 |
寿 | 75 |
高垣 | 72 |
戸松 | 52 |
豊崎 | 29 |
夏川 | 12 |
例
SELECT
氏名
,点数
,CASE WHEN 点数 = 100 THEN 'Aランク'
WHEN 点数 >= 70 THEN 'Bランク'
WHEN 点数 >= 30 THEN 'Cランク'
ELSE 'Dランク'
END AS ランク
FROM テーブル
ORDER BY CASE WHEN 点数 = 100 THEN 'Aランク'
WHEN 点数 >= 70 THEN 'Bランク'
WHEN 点数 >= 30 THEN 'Cランク'
ELSE 'Dランク'
END
,氏名
結果
氏名 | 点数 | ランク |
麻倉 | 100 | Aランク |
雨宮 | 88 | Bランク |
寿 | 75 | Bランク |
高垣 | 72 | Bランク |
戸松 | 52 | Cランク |
豊崎 | 29 | Dランク |
夏川 | 12 | Dランク |
上の例だと同じCASE文が出てきて長い上に難解ですよね。
そこでORDER BY句のカラムを数字で指定してみます。
SELECT
氏名
,点数
,CASE WHEN 点数 = 100 THEN 'Aランク'
WHEN 点数 >= 70 THEN 'Bランク'
WHEN 点数 >= 30 THEN 'Cランク'
ELSE 'Dランク'
END AS ランク
FROM テーブル
ORDER BY 3,氏名
--3列目のカラム(ランク)に対して昇順でソートしてます。
なんと同じ文を1回書いただけで済むようになりました!
(結果は上と同じ)
GROUP BYの場合
カラムを数字で指定できるのはORDER BY句だけではなくGROUP BY句でも参照することができます。
SELECT
,CASE WHEN 点数 = 100 THEN 'Aランク'
WHEN 点数 >= 80 THEN 'Bランク'
WHEN 点数 >= 30 THEN 'Cランク'
ELSE 'Dランク'
END AS ランク
,count(*) AS 人数
FROM テーブル
GROUP BY 1
ORDER BY 1
結果
ランク | 人数 |
Aランク | 1 |
Bランク | 3 |
Cランク | 1 |
Dランク | 2 |
これで同じ文を書かずにランク毎に集計することが可能です!
注意事項
MySQLは、「列番号の指定はSQL標準から外れたので非推奨です」
と記載があるのでpostgresqlも恒久的に使うのは避けた方がいいかもしれません。
まとめ
とても便利な指定方法なんですが、注意事項にもある通り
ずっと使うには適してないかもしれないですが、データ出しや集計をしたい時にはかなり楽になるので
覚えておくと役に立つかと思われます。
このカテゴリの最新記事
2024.08.22
centos7サポート終了に伴うOSの移行について
2023.04.19
専門用語を使わずにゼロからわかるSQLインジェクション
2024.01.12
モダンなHTMLとCSSマークアップ方法
2024.10.03
【Laravel】主キーが文字列型の場合に値を取得できない問題と解決法