2024
October
09
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も恒久的に使うのは避けた方がいいかもしれません。
まとめ
とても便利な指定方法なんですが、注意事項にもある通り
ずっと使うには適してないかもしれないですが、データ出しや集計をしたい時にはかなり楽になるので
覚えておくと役に立つかと思われます。
このカテゴリの最新記事
2025.10.02
Microsoft Access VBA開発が変わる!Visual Studio Code & Gemini CLIで始めるAIコーディング
2023.10.31
初心者向けDocker環境構築
2023.04.24
WebGLに使用するライブラリ・ゲームエンジンの選択
2023.10.02
【Linux】よく使うLinuxコマンド一覧