Filtrar grupos con HAVING
Objetivos
Vas a elegir clientes que superan un umbral de pagos y a ubicar cada condición en la etapa correcta de la consulta.
Concepto
WHERE quita filas antes de formar los grupos. HAVING quita grupos después de calcular sus agregados; por eso puede evaluar COUNT(*) o SUM(amount).
Escribe primero la pregunta: “¿qué clientes hicieron al menos diez pagos?”. La cantidad de pagos no existe en una sola fila de origen, así que se compara después de agrupar.
Ejemplo
SELECT
customer_id,
COUNT(*) AS payment_count,
ROUND(SUM(amount), 2) AS total_paid
FROM payment
WHERE amount > 0
GROUP BY customer_id
HAVING COUNT(*) >= 10
ORDER BY payment_count DESC, customer_id ASC
LIMIT 10;WHERE amount > 0 filtra pagos individuales. HAVING COUNT(*) >= 10 conserva grupos cuyo número de pagos llega al umbral. La condición de WHERE es pedagógica y no afirma que los pagos válidos deban tener ese criterio de negocio.
Nota
Recuerda: no pongas una condición sobre una fila individual en HAVING si puede ir en WHERE. Reserva HAVING para el resultado agregado del grupo.
Práctica guiada
- Cambia el umbral de diez a cinco y predice cómo cambia el conjunto de clientes.
- Quita
HAVINGy compara cuántos grupos aparecen. - Cambia la condición por
HAVING COUNT(*) > 1para encontrar clientes con pagos repetidos.
Reto
Encuentra clientes con más de un pago y un importe acumulado mayor que 100. Devuelve customer_id, cantidad de pagos y total. Ordena por total descendente. Explica por qué las dos condiciones van en HAVING.
Quiz
¿Dónde va la condición “al menos diez pagos por cliente”?
- A. En
WHERE, porque se evalúa antes del grupo. - B. En
HAVING, porque usa el conteo del grupo. - C. En
ORDER BY, porque ordena los pagos.
Respuesta: B. HAVING filtra usando el resultado de una función agregada.
Comprobación
Ya separas el filtrado de filas del filtrado de grupos. El siguiente módulo agrega lógica condicional y consultas organizadas para análisis.