¿Por qué mi total acumulado en SQL Server devuelve un número equivocado?
Cuaderno N°05 · Serie «Trucos de T-SQL para tu DW»
Por Javier Loria · Lectura ~11 min · SQL Server · Window Functions · Data Warehouse
¿Cómo hago un total acumulado en SQL Server?» es de las primeras consultas que cualquiera escribe contra un data warehouse — y una de las que más callado falla. La suma acumulada con OVER (PARTITION BY … ORDER BY …) se ve correcta y devuelve un número equivocado: incluye filas que no debería, o el LAST_VALUE devuelve la propia fila en vez del último valor del grupo. No truena; entrega un reporte que se ve bien y miente.
La causa casi siempre es la misma: la función de ventana se escribió sin definir el frame, y la diferencia entre ROWS y RANGE decide el resultado. Este cuaderno muestra las dos trampas del frame que SQL Server elige por ti, por qué pasan y cómo se corrigen con una línea.
Qué vas a encontrar:
- El síntoma: el acumulado que «adivina el futuro» e incluye filas de más.
- La culpable: el frame por defecto que nadie escribió (RANGE vs ROWS).
- El patrón fino: el acumulado que excluye la fila actual.
- Por qué LAST_VALUE no devuelve «el último» como esperabas.
- Cómo corregir ambas con una línea de frame explícito.
