Skip to content
Empieza gratis

¿Cómo pongo el total del grupo junto a cada fila sin perder filas?

Pon el total de cada sucursal junto a cada uno de sus meses, sin que las 35 filas se conviertan en 3.

Curso gratis. Tu Maestro, una IA, .

Trabajas con los datos de una pequeña cadena de fondas en Puebla, con tres sucursales: Centro, Norte y Sur. Tienes las ventas de cada mes de 2025 (son datos sintéticos, inventados para el curso) y quieres ver cada mes y además, en la misma fila, el total del año de su sucursal, para saber qué tanto pesó ese mes.

Con GROUP BY sacas el total, pero pierdes los meses: 35 filas se vuelven 3. Una función de ventana te da las dos cosas a la vez. En esta página la escribes tú, en los primeros minutos.

Antes de empezar, dos preguntas rápidas. Contesta lo que creas: no es examen, y te dice a ti (y a tu Maestro) desde dónde arrancas.

Nota: ¿GROUP BY o WITH te son nuevos?

Este curso empieza donde termina SQL para gente de datos: da por hecho que ya usas SELECT, WHERE, ORDER BY, SUM, GROUP BY y consultas con WITH. Si alguno de esos te suena raro, ese curso los enseña desde cero.

Comprueba lo que sabes: La tabla ventas_mensuales tiene 35 filas de 3 sucursales. Escribes SELECT sucursal, mes, SUM(ventas) OVER (PARTITION BY sucursal) FROM ventas_mensuales, sin GROUP BY. ¿Cuántas filas regresa?

Comprueba lo que sabes: Numeras los meses de cada sucursal con ROW_NUMBER() OVER (PARTITION BY sucursal ORDER BY mes) y quieres quedarte solo con la fila número 1. ¿Puedes poner esa condición en el WHERE?

Inténtalo

La consulta de abajo usa GROUP BY y regresa una fila por sucursal. Córrela primero para ver las 3 filas. Luego cámbiala:

  1. Quita el GROUP BY.
  2. Pide sucursal, mes y ventas, y agrega SUM(ventas) OVER (PARTITION BY sucursal) AS total_sucursal.
  3. Ordena por sucursal, mes.

OVER (...) es lo que convierte a SUM en una función de ventana. PARTITION BY sucursal le dice qué filas mirar para cada fila: las de su misma sucursal. Cuando la tabla de resultados se marca, lo lograste. Si te sale un error o te siguen saliendo 3 filas, pregúntale a tu Maestro.

Regresa las 35 filas con sucursal, mes, ventas y una columna totalsucursal con el total del año de su sucursal, en ese orden de columnas. Usa SUM(ventas) OVER (PARTITION BY sucursal) en lugar de GROUP BY, y ordena por sucursal, mes. Terminaste cuando ves 35 filas y cada fila de C

Tu turno

Regresa las 35 filas con sucursal, mes, ventas y una columna total_sucursal con el total del año de su sucursal, en ese orden de columnas. Usa SUM(ventas) OVER (PARTITION BY sucursal) en lugar de GROUP BY, y ordena por sucursal, mes. Terminaste cuando ves 35 filas y cada fila de Centro dice 2174100.

Tablas: ventas_mensuales (sucursal, mes, ventas)

ventas_mensuales · 35 filas

ColumnaTipo
sucursal Nombre de la sucursal: Centro, Norte o Sur.VARCHAR
mes Primer día del mes que resume la fila.DATE
ventas Ventas del mes, en pesos.BIGINT

Primeras filas

sucursalmesventas
Centro2025-01-01165100
Centro2025-02-01155700
Centro2025-03-01178700

Cada ejecución empieza con copias nuevas de las tablas del curso, así que puedes probar lo que quieras.

Listo para ejecutar tu consulta.

Ejecútalo tú

Lo que acabas de ver es la idea de todo el curso: una función de ventana calcula un valor para cada fila mirando otras filas, y no junta nada. Las 35 filas siguen ahí; cada una ganó una columna.

Fila por fila

Así salieron algunas filas de la solución en el sandbox de Maestro:

sucursalmesventastotal_sucursal
Centro2025-01-011651002174100
Centro2025-02-011557002174100
Norte2025-01-011289001705500
Sur2025-01-011055001294800

Para cada fila, la consulta busca las filas de su misma sucursal, las suma y escribe el resultado en esa fila. Por eso las 12 filas de Centro repiten 2174100, y las 11 de Sur repiten 1294800: a Sur le falta junio, y la suma solo ve las filas que existen.

La "ventana" es el conjunto de filas que la función mira para calcular el valor de una fila. Con PARTITION BY sucursal, la ventana de una fila de Norte son las 12 filas de Norte. Con OVER (), vacío, la ventana es toda la tabla.

Con esto ya puedes comparar cada mes con su total: ventas / total_sucursal. Eso lo haces en la siguiente página. ¿Tienes en el trabajo una tabla donde quieras el total de cada grupo junto a cada fila? Cuéntasela a tu Maestro.

Así suele llegar en una entrevista: "muestra a cada empleado junto al salario promedio de su departamento". Quien no conoce las ventanas escribe un GROUP BY en una subconsulta y la une de regreso a la tabla. Con AVG(salario) OVER (PARTITION BY departamento) es una sola línea, y las filas de los empleados no se pierden.

Para mañana en el trabajo: busca una consulta tuya que haga un GROUP BY solo para unir el resultado otra vez a la tabla original. Esa unión es justo lo que una ventana te ahorra.

Tres preguntas de lo que viene

Estas tres no las explica esta página: son para ver qué traes. Contesta lo que creas. Al final del curso vuelven, con otras palabras.

Comprueba lo que sabes: Ordenas los meses de mayor a menor venta con RANK(). Dos meses empatan en el lugar 2. ¿Qué lugar le toca al mes que sigue?

Comprueba lo que sabes: Calculas una suma acumulada de pedidos con SUM(monto) OVER (ORDER BY fecha), y una clienta tiene dos pedidos el mismo día. ¿Qué muestran esas dos filas en la columna acumulada?

Comprueba lo que sabes: A la sucursal Sur le falta junio en la tabla. Con LAG(ventas) OVER (PARTITION BY sucursal ORDER BY mes), ¿con qué mes se compara julio?