Sé que tengo que escribir SUM
dos veces, si deseo usarlo en una HAVING
cláusula (o usar una tabla derivada de lo contrario):
SELECT id,
sum(hours) AS totalhours
FROM mytable
GROUP BY id
HAVING sum(hours) > 50;
Mi pregunta ahora es si esto es subóptimo o no. Como programador, esta consulta parece que el DB calculará la suma dos veces. ¿Es así o debo confiar en las optimizaciones que el motor DB hará por mí?
Actualización: una explicación de una consulta comparable:
postgres=> explain select sum(counttodo) from orderline group by orderlineid having sum(counttodo) > 100;
QUERY PLAN
--------------------------------------------------------------------
HashAggregate (cost=1.31..1.54 rows=18 width=8)
Filter: (sum(counttodo) > 100)
-> Seq Scan on orderline (cost=0.00..1.18 rows=18 width=8)
(3 rows)
HAVING
cláusula, pero, a mi entender, internamente esto se hace al revés.
HAVING
(y luego sacando la definición de columna de la SELECT
cláusula) - por alguna razón simplemente no hacen eso.