データベースエンジンで実行される順序は次のとおりです。
これは、物事がどのように実行されるかについてのセマンティックビューであり、データベースは異なる順序で物事を実行する可能性がありますが、この方法で実行されたかのように結果を生成する必要があることに注意してください。
- 最初にFROM部分が評価され、どこからデータを取得しますか
- 次に、WHERE部分が評価され、どの行に関心があるか
- 次に、GROUP BY部分が評価され、結果の行をどのように組み合わせるか
- 次に、HAVING部分が評価され、どのグループに関心があるかが評価されます
- 次に、ORDER BY部分が評価されます。これらの行/グループは、どの順序で実行しますか?
- 最後に、SELECT部分が評価されます。どの列に関心があるか
一部のデータベースエンジンでは、SELECT部分の2番目の列でグループ化するために「GROUPBY 2」と言うことでこれを回避できますが、上記の順序に固執する場合は、コードが動作しないのは、totalまたはtotal2という名前の列が(まだ)ないことです。
つまり、2つの表現を繰り返すか、別の方法を見つける必要があります。
できることは、サブクエリを使用することです(これをサポートするMySQLバージョンを使用している場合):
SELECT total, total2, total+total2 as grandtotal
FROM (
SELECT sum(EXPR) as total, sum(EXPR) as total2
FROM tablename
) x
コメントに従って残りを打ち消します。
MySQLについてはよくわからないので、サブクエリのエイリアスを作成する必要があるかもしれません:
...
FROM tablename
) AS x
^-+^
|
+-- add this
一部のデータベースエンジンでは、サブクエリのエイリアシング時にキーワードASの使用も許可されていないため、上記が機能しない場合は、次のことを試してください。
...
FROM tablename
) x
^
|
+-- add this