Agrupar por periodo y detectar meses ausentes
Objetivos
Al terminar podrás resumir fechas por periodo y explicar qué significa que una etiqueta temporal no aparezca.
Concepto
DATE_FORMAT(payment_date, '%Y-%m') crea una etiqueta de año y mes. Al agrupar por esa expresión, MySQL devuelve los periodos que tienen filas en payment.
Un mes ausente no es un grupo con importe cero: significa que la consulta no encontró filas para formar ese grupo. Para mostrar todos los meses de un calendario necesitas una tabla de periodos y una unión externa; el resumen por sí solo no los inventa.
Ejemplo
SELECT
DATE_FORMAT(payment_date, '%Y-%m') AS payment_month,
COUNT(*) AS payment_count,
ROUND(SUM(amount), 2) AS total_amount
FROM payment
GROUP BY DATE_FORMAT(payment_date, '%Y-%m')
ORDER BY payment_month;Cada fila resume un mes observado. La cuenta y el importe describen las filas de pago presentes, no un calendario completo ni los meses sin actividad.
Práctica guiada
- Añade
COUNT(DISTINCT customer_id)como otra medida del periodo. - Filtra un año con un intervalo semiabierto y compara cuántos grupos aparecen.
- Escribe qué datos necesitarías para mostrar meses sin registros.
Reto
Resume por mes el conteo y promedio de pagos. Mantén el orden cronológico y redacta una nota que explique por qué el resultado no contiene periodos vacíos.
Ver respuesta al reto
SELECT DATE_FORMAT(payment_date, '%Y-%m') AS payment_month,
COUNT(*) AS payment_count,
ROUND(AVG(amount), 2) AS average_amount
FROM sakila.payment
GROUP BY DATE_FORMAT(payment_date, '%Y-%m')
ORDER BY payment_month;Solo aparecen meses que tienen pagos. Para mostrar meses vacíos se necesita una tabla calendario y un LEFT JOIN.
Quiz
Comprobación
Ya distingues periodos observados de periodos vacíos. La siguiente lección compara tres formas de numerar un ranking.