Contenido de esta guía
Qué pregunta responde SUM
SUM reúne valores numéricos y devuelve un total. Puede resumir todas las filas filtradas o producir un total por grupo cuando se combina con GROUP BY.
La función ignora los valores NULL. Si no recibe ningún valor no nulo, el resultado habitual es NULL, no cero. Esa diferencia importa cuando una consulta puede quedarse sin filas.
Sintaxis y orden mental
SELECT SUM(expresion) AS total
FROM tabla
WHERE condicion;FROMdefine la fuente.WHEREdescarta filas antes del cálculo.SUMagrega los valores restantes.- El alias explica qué representa el total.
No sumes una columna por costumbre. Comprueba primero qué representa cada fila. Si una cabecera de pedido repite su total al unirla con varias líneas, sumar ese total después del JOIN lo duplicará.
Ejemplo guiado: unidades por categoría
Queremos conocer cuántas unidades hay en stock dentro de cada categoría. El grupo se forma por categoria y SUM agrega el stock de sus productos.
SELECT categoria, SUM(stock) AS unidades
FROM productos
GROUP BY categoria
ORDER BY unidades DESC, categoria ASC;| categoria | unidades |
|---|---|
| Accesorios | 55 |
| Audio | 11 |
| Almacenamiento | 9 |
| Pantallas | 6 |
| Ordenadores | 0 |
La suma global del stock es 81. Separar por categoría permite ver de dónde sale ese total y conserva también el grupo con cero unidades.
Qué ocurre si no hay filas
SELECT SUM(total) AS total
FROM pedidos
WHERE estado = 'devuelto';Como no existe ningún pedido con ese estado, SUM devuelve NULL. Usa COALESCE(SUM(total), 0) únicamente cuando el significado de negocio de «sin filas» deba mostrarse como cero.
Error frecuente
Sumar después de multiplicar filas con un JOIN
Antes de agregar, comprueba la granularidad: una fila por pedido, por producto o por línea. Si el JOIN crea varias filas para el mismo pedido, su total puede contarse varias veces. Agrega primero al nivel correcto o suma las líneas reales.
Comprueba lo aprendido
Suma el importe pendiente
Devuelve el importe total de los pedidos cuyo estado es pendiente. Usa el alias total_pendiente.
pedidos antes de agregar.total.SUM(total) AS total_pendiente.Solución razonada
SELECT SUM(total) AS total_pendiente
FROM pedidos
WHERE estado = 'pendiente';| total_pendiente |
|---|
| 840,3 |
Las seis filas pendientes suman 840,3. El filtro se aplica antes de que la función calcule el total.
Compatibilidad entre motores
SUM es una agregación común y omite valores nulos. El tipo de salida y el tratamiento de desbordamientos pueden variar según el tipo de entrada y el motor. SQLite ofrece además total(), que devuelve 0,0 cuando no hay valores, pero esa función no es SQL portable.
Qué debes recordar
SUMagrega valores numéricos no nulos.WHEREdecide qué filas entran en el total.- Sin valores, el resultado puede ser
NULL. - Revisa la granularidad antes de sumar después de un
JOIN.