Hier is de volgorde van hoe dingen worden uitgevoerd in een database-engine.
Merk op dat dit een semantische weergave is van hoe dingen worden uitgevoerd, de database kan dingen in een andere volgorde doen, maar het moet resultaten opleveren alsof het op deze manier is gedaan.
- Eerst wordt het FROM-gedeelte geëvalueerd, waar haal ik de gegevens vandaan
- Vervolgens wordt het WHERE-gedeelte geëvalueerd, in welke rijen zijn we geïnteresseerd
- Vervolgens wordt het GROUP BY-gedeelte geëvalueerd, hoe combineren we de resulterende rijen
- Vervolgens wordt het HAVING-gedeelte geëvalueerd, in welke groepen zijn we geïnteresseerd
- Vervolgens wordt het ORDER BY-gedeelte geëvalueerd, in welke volgorde willen we die rijen/groepen
- Ten slotte wordt het SELECT-gedeelte geëvalueerd, in welke kolommen zijn we geïnteresseerd
Sommige database-engines laten u dit echter omzeilen door "GROUP BY 2" te zeggen om te groeperen op de 2e kolom in het SELECT-gedeelte, maar als u zich aan de bovenstaande volgorde houdt, zou u nu moeten weten dat de reden dat uw code niet 't werkt is dat er (nog) geen kolommen zijn met de namen total of total2.
Met andere woorden, u moet de twee uitdrukkingen herhalen of een andere manier vinden om dit te doen.
Wat u kunt doen, is een subquery gebruiken (op voorwaarde dat u een MySQL-versie gebruikt die dit ondersteunt):
SELECT total, total2, total+total2 as grandtotal
FROM (
SELECT sum(EXPR) as total, sum(EXPR) as total2
FROM tablename
) x
Doorhalen van de rest volgens de opmerking.
Ik weet echter niet veel over MySQL, dus misschien moet je de subquery een alias geven:
...
FROM tablename
) AS x
^-+^
|
+-- add this
Sommige database-engines staan het gebruik van het trefwoord AS ook niet toe bij het aliasen van subquery's, dus als het bovenstaande niet werkt, probeer dan dit:
...
FROM tablename
) x
^
|
+-- add this