Ir al contenido
wannacode

HAVING: una condición para los grupos

En resumen: HAVING filtra grupos después de agrupar, WHERE filtra filas sueltas antes, y una condición sobre SUM o COUNT va en HAVING.

Problema

La tarjeta de fidelidad

La tienda lanza una tarjeta de fidelidad: los clientes con más de 3 pedidos reciben una. Sabes contar los pedidos de cada cliente con GROUP BY customer_id. Salen 18 filas. ¿Cómo conservas solo las de más de 3?

WHERE no sirve: mira pedidos sueltos, y la cuenta pertenece al cliente entero.

La idea

HAVING

HAVING es una condición para los grupos. Va después de GROUP BY y puede contener una agregación:

SQLbase de datos: tienda

Cuatro clientes. Se forman los grupos, se calcula la cuenta de cada uno, y HAVING conserva solo los grupos para los que la condición es verdadera.

Pruébalo

Los pedidos grandes

Para el envío gratis necesitamos los pedidos de más de 30 €. El campo muestra el valor de cada pedido. Conserva solo los de más de 30 €.

SQLbase de datos: tienda

Míralo

SUM en WHERE

El primer intento de casi todos usa WHERE. Ejecútalo:

SQLbase de datos: tienda

SQLite se detiene con «misuse of aggregate»: una agregación en un lugar donde no corresponde. En WHERE la base mira las filas una por una. Todavía no hay grupos, así que no hay nada que sumar.

La idea

WHERE y HAVING juntos

Los dos no se estorban. Trabajan en sitios distintos:

  • WHERE filtra las filas antes de los grupos;
  • HAVING filtra los grupos después.

La tarjeta de fidelidad sin los pedidos cancelados:

SQLbase de datos: tienda

El cliente 7 se cayó. Tiene 4 pedidos, pero uno está cancelado. WHERE lo quitó antes de formar los grupos, y en su grupo quedaron 3.

Una condición que mira una fila suelta (status, una fecha, un precio) va en WHERE. Reduce las filas que la base tiene que agrupar. En HAVING deja solo las condiciones sobre agregaciones.

Pruébalo

Solo una vez

Marketing quiere escribir a los clientes que pidieron exactamente una vez en 2026. Cuenta todos los pedidos, también los cancelados. Muestra customer_id y la cantidad de sus pedidos de 2026.

SQLbase de datos: tienda

Ejercicio

Dos informes

1. Los proveedores hacen descuento en los productos que vendemos mucho. ¿Qué productos han vendido al menos 15 unidades?

Muestra product_id y las unidades vendidas de los productos con al menos 15 unidades vendidas.

SQLbase de datos: tienda

2. ¿En qué meses hubo al menos 6 pedidos? Esos meses necesitan más gente en el almacén.

Muestra el mes (año-mes) y la cantidad de pedidos de los meses con al menos 6 pedidos.

SQLbase de datos: tienda

Test

Ponte a prueba

1. ¿Qué condición encuentra los pedidos de más de 30 €?
2. ¿Cuándo se aplica WHERE?
3. El cliente 7 tiene 4 pedidos, uno de ellos cancelado. ¿Sale con WHERE status <> 'cancelled' … HAVING COUNT(*) > 3?
4. ¿Qué significa el error «misuse of aggregate function SUM()»?

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·