Funciones de agregación: COUNT, SUM, AVG
En resumen: Las funciones de agregación COUNT, SUM, AVG, MIN y MAX reducen muchas filas a un solo valor: una cantidad, un total, un promedio, el valor más pequeño o el más grande.
Problema
El informe del lunes
Cada lunes el dueño pregunta lo mismo. ¿Cuántos clientes tenemos? ¿De cuántas ciudades son? ¿Cuánto dinero pasó por la tienda? ¿Cuál es el producto más caro?
Hasta ahora las consultas devolvían filas. Aquí necesitas un número a partir de muchas filas. Contar a mano no sirve: mañana habrá miles de filas.
La idea
COUNT: cuántos
COUNT(*) cuenta las filas:
Entran veinte filas, sale una. Una función que comprime muchas filas en un valor se llama función de agregación.
COUNT tiene dos formas más. COUNT(columna) cuenta solo las filas donde la columna no es NULL. COUNT(DISTINCT columna) cuenta los valores distintos:
20 clientes, 19 con ciudad (Boris no tiene) y 6 ciudades distintas.
Pruébalo
Cuántos se han agotado
La encargada no quiere los nombres, solo el número: ¿cuántos productos tienen existencias 0? El campo muestra cuáles. Conviértelo en un solo número.
Solución
SELECT COUNT(*) FROM products WHERE stock = 0;SELECT COUNT(*) FROM products WHERE stock = 0. Dos productos. WHERE se ejecuta primero y conserva las dos filas, y COUNT(*) las cuenta.
La idea
SUM, AVG, MIN, MAX
Las otras cuatro funciones trabajan con los valores de la columna:
SUM: el total;AVG: el promedio;MINyMAX: el valor más pequeño y el más grande.
La facturación es la suma de cada línea de pedido: cantidad por precio.
1963,50 €. Ojo: aquí están también las líneas de los pedidos cancelados. Qué pedidos están cancelados lo dice orders, mientras que los importes están en order_items. Uniremos las dos tablas en el próximo módulo, con JOIN.
El precio más bajo, el más alto y el promedio de los productos:
MIN y MAX funcionan también con texto y con fechas. El primer y el último pedido:
Pruébalo
La valoración del café
El café en grano (product_id = 17) recibió una mala reseña. ¿Cuántas reseñas tiene y cuál es su puntuación media?
Solución
SELECT COUNT(*), AVG(rating)
FROM reviews
WHERE product_id = 17;SELECT COUNT(*), AVG(rating) FROM reviews WHERE product_id = 17. Tres reseñas y una media de 3,33: dos buenas (5 y 4) y un 1.
Míralo
Una fila, incluso cuando no hay nada
Una agregación sin grupos siempre devuelve una fila. Las tres líneas del pedido 8 se vuelven una:
¿Y si ni una sola fila pasa WHERE? Todavía no hay reseñas de octubre de 2026:
Sigue siendo una fila: COUNT da 0 y AVG da NULL. No hay nada que promediar. SUM, MIN y MAX hacen lo mismo. En un informe el NULL parece una celda vacía, así que, cuando haga falta, sustitúyelo con COALESCE(SUM(...), 0).
Míralo
AVG salta el NULL
Igual que COUNT(columna), también SUM, AVG, MIN y MAX saltan el NULL. Con AVG esto cambia el resultado: no divides entre todas las filas, sino entre las que tienen valor.
¿Cuál es el promedio de existencias? ¿Y el promedio de existencias de los productos que realmente tenemos? NULLIF(stock, 0) convierte los ceros en NULL:
Cuando escribas AVG sobre una columna con NULL, pregúntate: ¿deben contar los vacíos como cero? Si es así, AVG(COALESCE(columna, 0)). Si no, AVG(columna) ya lo hace.
Ejercicio
Dos informes
1. El proveedor de café pregunta cuántos paquetes de café en grano (product_id = 17) hemos vendido y por cuánto dinero.
Las unidades y el dinero del café en grano:
Solución
SELECT SUM(quantity), SUM(quantity * unit_price)
FROM order_items
WHERE product_id = 17;SELECT SUM(quantity), SUM(quantity * unit_price) FROM order_items WHERE product_id = 17. 10 paquetes por 149 €. COUNT(*) daría aquí 3: tantas líneas, no unidades.
2. ¿Cuántos pedidos se han entregado, y a cuántos clientes distintos?
Los pedidos entregados y los clientes distintos que hay en ellos:
Solución
SELECT COUNT(*), COUNT(DISTINCT customer_id)
FROM orders
WHERE status = 'delivered';SELECT COUNT(*), COUNT(DISTINCT customer_id) FROM orders WHERE status = 'delivered'. 21 pedidos a 11 clientes: algunos clientes recibieron más de uno.
Test
Ponte a prueba
Lecciones relacionadas
Sección «Lecciones relacionadas»- Se basa en: NULL: sin valor · ORDER BY, LIMIT y DISTINCT · Aritmética en una consulta · CASE y los valores que faltan
- Continúa en: GROUP BY: un informe por grupos · HAVING: una condición para los grupos · El orden de ejecución de una consulta · LEFT JOIN: también las filas sin pareja
- Ejercicios sobre el tema: Resumir