Agrupar pagos por cliente
Objetivos
Vas a cambiar la unidad del resultado: de una fila por pago a una fila por cliente con pagos.
Concepto
GROUP BY customer_id reúne todos los pagos del mismo cliente. COUNT y SUM se calculan por grupo.
Cuando agrupas, cada columna que seleccionas debe estar en el GROUP BY o dentro de una función agregada. Esto funciona con el modo estricto ONLY_FULL_GROUP_BY, habitual en MySQL 8, y evita que MySQL escoja un nombre arbitrario.
Ejemplo
SELECT
customer_id,
COUNT(*) AS payment_count,
ROUND(SUM(amount), 2) AS total_paid,
ROUND(AVG(amount), 2) AS average_payment
FROM payment
GROUP BY customer_id
ORDER BY total_paid DESC, customer_id ASC
LIMIT 10;El resultado está en nivel cliente. Ordena primero por total y usa customer_id para que los empates tengan un orden fijo.
Nota
Error común: seleccionar first_name de customer sin incluirlo en un grupo válido. Para añadir el nombre, une customer y agrupa correctamente o resume primero los pagos por cliente.
Práctica guiada
- Quita
AVG(amount)y describe qué métrica desapareció. - Cambia el orden a
payment_count DESCy observa cómo cambia el ranking. - Cuenta las filas de la consulta: cada fila representa un cliente con pagos, no un pago.
Reto
Devuelve una fila por staff_id con la cantidad de pagos y el importe total procesado. Ordena por total descendente y luego por staff_id.
Quiz
¿Qué significa una fila del resultado después de agrupar por customer_id?
- A. Un pago.
- B. Un cliente que tiene pagos.
- C. Una película.
Respuesta: B. Cada grupo reúne los pagos de un cliente.
Comprobación
GROUP BY decide qué representa una fila del resumen. Ahora filtrarás grupos completos con HAVING.