Ecco l'ordine di esecuzione delle cose in un motore di database.
Nota che questa è una vista semantica di come vengono eseguite le cose, il database potrebbe eseguire le cose in un ordine diverso, ma deve produrre risultati come se fosse stato fatto in questo modo.
- Prima viene valutata la parte FROM, da dove ottengo i dati
- Quindi viene valutata la parte WHERE, a quali righe siamo interessati
- Quindi viene valutata la parte GROUP BY, come combiniamo le righe risultanti
- Poi viene valutata la parte HAVING, a quali gruppi siamo interessati
- Quindi viene valutata la parte ORDER BY, quale ordine vogliamo quelle righe/gruppi
- Infine, viene valutata la parte SELECT, a quali colonne siamo interessati
Alcuni motori di database ti consentono di aggirare questo problema, dicendo "GRUPPO PER 2" per raggruppare per la seconda colonna nella parte SELECT, ma se ti attieni all'ordine sopra, dovresti ormai sapere che il motivo per cui il tuo codice non non funziona è che non ci sono colonne con i nomi total o total2 (ancora).
In altre parole, devi ripetere le due espressioni o trovare un altro modo per farlo.
Quello che puoi fare è usare una sottoquery (a patto che tu sia su una versione di MySQL che lo supporti):
SELECT total, total2, total+total2 as grandtotal
FROM (
SELECT sum(EXPR) as total, sum(EXPR) as total2
FROM tablename
) x
Tralasciando il resto come da commento.
Non so molto di MySQL, quindi potresti dover alias la sottoquery:
...
FROM tablename
) AS x
^-+^
|
+-- add this
Alcuni motori di database inoltre non consentono l'utilizzo della parola chiave AS durante l'alias di sottoquery, quindi se quanto sopra non funziona, prova questo:
...
FROM tablename
) x
^
|
+-- add this