¿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:
- Quita el
GROUP BY. - Pide
sucursal,mesyventas, y agregaSUM(ventas) OVER (PARTITION BY sucursal) AS total_sucursal. - 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
| Columna | Tipo |
|---|---|
| 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
| sucursal | mes | ventas |
|---|---|---|
| Centro | 2025-01-01 | 165100 |
| Centro | 2025-02-01 | 155700 |
| Centro | 2025-03-01 | 178700 |
Cada ejecución empieza con copias nuevas de las tablas del curso, así que puedes probar lo que quieras. Tab agrega sangría; para salir del editor, presiona Escape y luego Tab.
Listo para ejecutar tu consulta.
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:
| sucursal | mes | ventas | total_sucursal |
|---|---|---|---|
| Centro | 2025-01-01 | 165100 | 2174100 |
| Centro | 2025-02-01 | 155700 | 2174100 |
| Norte | 2025-01-01 | 128900 | 1705500 |
| Sur | 2025-01-01 | 105500 | 1294800 |
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.