PostgreSQLやMySQLでは、GROUP BY 句でエイリアス(別名)が使える

標準SQLでは、以下のようなGROUP BY句で別名を使ったSQLはエラーになる。
SqlServerOracleはそれに従うので以下SQLを実行できないが、PostgreSQLMySQLSQLを独自拡張しているので以下の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 句でエイリアスを使用して、カラムを参照できます。