¿La condición está en una línea o en un grupo?
Un estado o fecha pertenece a una línea de origen: utiliza WHERE. Existe un total, promedio o número de pedidos después de agrupar: usa HAVING.
El orden modifica el significado. Excluir filas canceladas antes de SUM no equivale a calcular todos los estados y luego ocultar ciertos grupos.
La consulta explicada
Empieza por definir qué debe representar una fila del resultado. Esta decisión determina las columnas, agrupaciones y controles necesarios.
El siguiente ejemplo aísla el mecanismo principal. Ejecútelo, observe el resultado y luego cambie una cláusula a la vez para comprender su efecto.
SELECT id_client, COUNT(*) AS commandes_payees
FROM commandes
WHERE statut = 'Pagado'
GROUP BY id_client
HAVING COUNT(*) >= 2;Lea el resultado como un analista.
WHERE solo prepara pedidos pagados. GROUP BY crea una fila por cliente y luego HAVING mantiene volúmenes de al menos dos.
Separe mentalmente estos pasos y controla la cantidad de registros devueltos en cada uno cuando la consulta se vuelva compleja.
- Formula el perímetro de las líneas.
- Establece el nivel de detalle para los grupos.
- Aplicar umbral en la agregación.
- Compara el total general con la suma de los grupos.
Errores que distorsionan el análisis
Una consulta puede ser válida sin responder correctamente a la pregunta. Los errores más costosos suelen ser silenciosos: perímetro incorrecto, línea multiplicada o valor faltante interpretado como cero.
Antes de compartir el resultado, compáralo con una pequeña muestra calculada manualmente y mantén la definición del alcance con la consulta.
- Escribe WHERE COUNT (*).
- Filtrar monto >= umbral en lugar de SUM(monto) >= umbral.
- Olvídese de GROUP BY.
- Comparar grupos construidos con diferentes perímetros.
Ponte en practica
Ejercite HAVING en la canasta promedio, luego cambie el umbral para observar los grupos retenidos.
El simulador SQL de SQL.tn solo ejecuta consultas de lectura sobre datos ficticios en su navegador. Puede probar varias escrituras y comparar sus resultados sin instalar ningún software.
Comprueba la diferencia con datos concretos
¿Quién ha pagado más de 100 € en total? Emma pagó 60 € y después 70 €. James pagó 80 € y tiene otro pedido cancelado de 100 €. Olivia pagó exactamente 100 €.
| customer_name | amount | status |
|---|---|---|
| Emma | 60 | paid |
| Emma | 70 | paid |
| James | 80 | paid |
| James | 100 | cancelled |
| Olivia | 100 | paid |
SELECT customer_name, SUM(amount) AS revenue
FROM orders
WHERE status = 'paid'
GROUP BY customer_name
HAVING SUM(amount) > 100
ORDER BY customer_name;WHERE elimina el pedido cancelado antes del cálculo. GROUP BY reúne las compras por cliente. HAVING conserva los totales estrictamente superiores a 100 €: solo queda Emma, con 130 €.
Prueba a sustituir HAVING por AND amount > 100 en WHERE: no queda ninguna fila. Has filtrado pedidos individuales, no totales. Con >= 100 en HAVING también aparecería Olivia.
Entorno SQL en el navegador
Comprueba la diferencia con datos concretos
Ejecuta una consulta de lectura sobre los datos ficticios de este ejercicio. No se envía nada a SQL.tn.
