タイガーラック クリエイティブブログ
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
        ,氏名

結果

氏名点数ランク
麻倉100Aランク
雨宮88Bランク
寿75Bランク
高垣72Bランク
戸松52Cランク
豊崎29Dランク
夏川12Dランク

上の例だと同じ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も恒久的に使うのは避けた方がいいかもしれません。

まとめ

とても便利な指定方法なんですが、注意事項にもある通り
ずっと使うには適してないかもしれないですが、データ出しや集計をしたい時にはかなり楽になるので
覚えておくと役に立つかと思われます。

このカテゴリの最新記事

関連記事

SHOP LIST

タイガーラック株式会社

〒577-0056
大阪府東大阪市長堂1-3-14 TOKUYASU Bld.