DÍA 16Agregaciones · SQL para Análisis de Datos

Crea una fila por cliente para comparar cantidad e importe de pagos.

Día 16 18 minInicial

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

  1. Quita AVG(amount) y describe qué métrica desapareció.
  2. Cambia el orden a payment_count DESC y observa cómo cambia el ranking.
  3. 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.

TU PROGRESO

Cargando estado…