La función SUM, cuando se la usa como función analítica y no como función de agrupamiento sirve para hacer lo que en inglés se llaman "running totals", y que podríamos llamar "acumulados", o "saldos" en castellano.
Al igual que las funciones de rango, la idea es darle a la función un criterio de ordenamiento y opcionalmente, otro de particionamiento:
SUM(Campo) OVER([PARTITION BY CampoPartiocion1[, CampoParticion2,...]] ORDER BY CampoOrdenamiento1[, CampoOrdenamiento2,...])
Por ejemplo, supongamos que tenemos una tabla en la cual se guardan los movimientos de una cuenta, y queremos consultar los movimientos y el saldo de la cuenta después de cada movimiento.
| Transacción | Mes | Importe | Saldo |
| 1 | 1 | 100.00 | 100.00 |
| 2 | 1 | -10.00 | 90.00 |
| 3 | 2 | -20.00 | 70.00 |
La forma de lograrlo es simple:
SELECT
Importe,
SUM(Importe) OVER (ORDER BY Transaccion) Saldo
FROM Movimientos
¿Qué pasa si queremos separar las transacciones de acuerdo a un criterio, por ejemplo: mes a mes, de tal forma que el saldo comience en cero cada mes? Usando el criterio PARTITION BY podemos lograrlo:
SELECT
Importe,
SUM(Importe) OVER (PARTITION BY Mes ORDER BY Transaccion) Saldo
FROM Movimientos
| Transacción | Mes | Importe | Saldo |
| 1 | 1 | 100.00 | 100.00 |
| 2 | 1 | -10.00 | 90.00 |
| 3 | 2 | -20.00 | -20.00 |
1 comentario:
el Order By no aplica en esta sintaxis.
Da error.
Publicar un comentario