Oto kolejność wykonywania czynności w silniku bazy danych.
Zwróć uwagę, że jest to semantyczny widok tego, jak rzeczy są wykonywane, baza danych może wykonywać różne czynności w innej kolejności, ale musi dawać wyniki tak, jakby była wykonana w ten sposób.
- Najpierw oceniana jest część FROM, skąd mam uzyskać dane
- Następnie oceniana jest część WHERE, które wiersze nas interesują
- Następnie oceniana jest część GROUP BY, jak połączyć wynikowe wiersze
- Następnie oceniana jest część POSIADAJĄCA, którymi grupami jesteśmy zainteresowani
- Następnie oceniana jest część ORDER BY, w jakiej kolejności chcemy uzyskać te wiersze/grupy
- Na koniec oceniana jest część SELECT, które kolumny nas interesują
Niektóre silniki baz danych pozwalają to obejść, mówiąc „GROUP BY 2”, aby pogrupować według drugiej kolumny w części SELECT, ale jeśli trzymasz się powyższej kolejności, powinieneś już wiedzieć, że twój kod nie nie działa to, że nie ma kolumn z nazwami total lub total2 (jeszcze).
Innymi słowy, musisz albo powtórzyć te dwa wyrażenia, albo znaleźć inny sposób na zrobienie tego.
Możesz użyć podzapytania (pod warunkiem, że korzystasz z wersji MySQL, która to obsługuje):
SELECT total, total2, total+total2 as grandtotal
FROM (
SELECT sum(EXPR) as total, sum(EXPR) as total2
FROM tablename
) x
Wykreślenie reszty zgodnie z komentarzem.
Nie wiem zbyt wiele o MySQL, więc być może będziesz musiał aliasować podzapytanie:
...
FROM tablename
) AS x
^-+^
|
+-- add this
Niektóre silniki baz danych również nie zezwalają na używanie słowa kluczowego AS podczas tworzenia aliasów podzapytań, więc jeśli powyższe nie działa, wypróbuj to:
...
FROM tablename
) x
^
|
+-- add this