標準SQLでは、以下のようなGROUP BY句で別名を使ったSQLはエラーになる。
SqlServerやOracleはそれに従うので以下SQLを実行できないが、PostgreSQL、MySQLはSQLを独自拡張しているので以下のSQLが期待通りに動作する。
SELECT FLOOR(value / 10) AS rank, count(*) FROM table GROUP BY rank
ちなみに標準SQLで上記に相当するSQLは以下のようになる。
SELECT FLOOR(value / 10) AS rank, count(*) FROM table GROUP BY FLOOR(value / 10)
または |
SELECT rank, count(*) FROM ( SELECT FLOOR(value / 10) AS rank, count(*) FROM table ) GROUP BY rank
Postgresで「SELECT count(*) AS c FROM table GROUP BY c」というSQLを実行しようとすると、「GROUP BYの中では集約関数を使用できません」エラーが発生したので、おそらくGROUP BY 句に書いたエイリアス名をそれに該当する式に展開してからSQLを実行するという糖衣構文として処理されているのだと思う。
PostgreSQL
https://www.postgresql.jp/document/9.3/html/queries-table-expressions.html
厳密なSQLでは、GROUP BYは、元となるテーブルの列によってのみグループ化できますが、
PostgreSQLでは、選択リストの列によるグループ化もできるように拡張されています。
単純な列名の代わりに、評価式でグループ化することもできます。
MySQL
https://dev.mysql.com/doc/refman/5.6/ja/problems-with-alias.html
エイリアスをクエリーの選択リストに使用すると、カラムを別の名前にすることができます。
GROUP BY、ORDER BY、または HAVING 句でエイリアスを使用して、カラムを参照できます。