Skip to content

Reto: un reporte mensual que no se rompe

Arma el reporte mensual por sucursal con todo lo del curso, y vuelve a las preguntas del principio.

Curso gratis. Tu Maestro, una IA, .

El reporte que pide la dirección

La dirección de Café Altura quiere una tabla para su junta anual: las ventas de cada sucursal en cada mes de 2025. Las tres sucursales, los doce meses, aunque una sucursal no haya abierto un mes. Son 36 filas, y la de Coyoacán en agosto dice 0.

Antes de escribir la consulta, repasa la lista de lo que puede romper un reporte con fechas. No todo aplica a cada reporte; revisarlo es lo que hace que no se rompa.

  1. Revisa el tipo y el formato

    Si la fecha es texto, conviértela con un formato explícito decidido con los datos, no con una fila.

  2. Pasa la hora a la zona del negocio

    Si viene en UTC, conviértela con el nombre de la zona, como America/Mexico_City, antes de sacar días o meses.

  3. Filtra con intervalos semiabiertos

    Desde el primer instante del periodo hasta antes del primero del siguiente: >= '2025-01-01' AND < '2026-01-01'.

  4. Agrupa por un periodo con año

    Trunca al mes, al trimestre o al lunes de la semana. Nunca por el número del mes solo.

  5. Une un calendario

    Para que aparezca cada periodo, haya filas o no, y decide qué valor lleva un periodo vacío.

  6. Compara tramos iguales

    El mismo tramo del calendario con cobertura equivalente, completo o parcial, y dilo en el reporte.

Inténtalo

La consulta de abajo ya tiene un calendario de los meses de 2025 (meses) y las ventas por sucursal y mes (por_mes), pero devuelve 35 filas: falta Coyoacán en agosto. Te faltan dos pasos. Primero, un calendario de sucursal por mes: toma las sucursales distintas y combínalas con cada mes con CROSS JOIN, que junta cada fila de una tabla con cada fila de la otra. Después, pega por_mes a ese calendario con un LEFT JOIN por sucursal y mes, y pon 0 donde no haya ventas.

Una buena respuesta tiene 36 filas ordenadas por sucursal y mes, y la fila de Coyoacán del 2025-08-01 en 0. Si te atoras en el CROSS JOIN, pregúntale a tu Maestro.

Tu turno

Arma el reporte de ventas por sucursal y mes de 2025, con las 3 sucursales y los 12 meses (36 filas) y 0 donde no hubo ventas, ordenado por sucursal y mes.

Tablas: ventas_diarias (fecha, sucursal, ventas)

ventas_diarias · 1,598 filas

ColumnaTipo
fecha El día de la venta.DATE
sucursal Roma, Coyoacán o Del Valle.VARCHAR
ventas Ventas del día en pesos.BIGINT

Primeras filas

fechasucursalventas
2025-01-02Roma12120
2025-01-02Coyoacán10650
2025-01-02Del Valle8880

O en pandas

Si prefieres pandas, arma el mismo reporte: agrupa por sucursal y mes, haz un calendario con pd.MultiIndex.from_product (cada sucursal con cada mes) y pégalo con reindex(..., fill_value=0). Una buena respuesta imprime 36 filas y la de Coyoacán en agosto en 0.

Tu turno

Arma en pandas el reporte de ventas por sucursal y mes de 2025, con las 3 sucursales y los 12 meses y 0 donde no hubo ventas. Imprime cuántas filas tiene y las filas en 0.

Datos: ventas-diarias, 1,598 filas
Los datos del ejercicio, "ventas-diarias". Tus cambios corren con tu código.
FilaQuitar
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Página 1 de 80

Las preguntas del principio

Al empezar contestaste seis preguntas. Aquí van seis parecidas, con otros datos. Compara lo que contestas ahora con lo que contestaste entonces.

Comprueba lo que sabes, 1 de 6: Una columna de texto en formato día/mes/año tiene 10/02/2026, 03/03/2026 y 25/01/2026. Con ORDER BY fecha, ¿cuál sale al final?

Lo que ya puedes hacer

Con pandas y con DuckDB, ahora puedes:

  • Saber si una columna de fechas es texto y por qué eso cambia un orden, un filtro o un máximo.
  • Decidir con los datos si un archivo trae el día o el mes primero, y convertirlo con un formato explícito.
  • Guardar y compartir fechas en ISO 8601.
  • Filtrar fechas con hora sin perder el último día, con intervalos semiabiertos.
  • Pasar de UTC a la hora de Ciudad de México con el nombre de la zona.
  • Agrupar por mes, trimestre y semana ISO sin juntar años.
  • Hacer que aparezcan los periodos sin datos y decidir qué valor llevan.
  • Calcular días, meses completos y edades, y comparar contra el mismo periodo del año pasado.

Lo que sigue

En este curso usaste WITH, LEFT JOIN y GROUP BY como herramientas. Si quieres dominarlas desde la base, o te costaron en los ejercicios, el curso SQL para gente de datos: piensa en tablas, no en hojas de cálculo enseña SQL desde cero en DuckDB: filtros, agrupaciones, joins, CTE y CASE WHEN. Si no sabes si te conviene, cuéntale a tu Maestro qué haces con datos.

Piensa en un reporte con fechas que haces o lees en tu trabajo. ¿Cuál de los pasos de la lista de esta página le falta, y qué cambiaría en sus números si lo agregas?

Reflexiona: Piensa en un reporte con fechas que haces o lees en tu trabajo. ¿Cuál de los pasos de la lista de esta página le falta, y qué cambiaría en sus números si lo agregas?

Solo tú y tu Maestro leen esto. Se queda en tu cuenta y se borra con ella.

Aquí termina la lectura; tu Maestro sigue.