viernes, septiembre 14, 2007

Otra Función Analítica: SUM

En el capítulo anterior les hablé del uso de las funciones RANK y DENSE_RANK para obtener la posición que ocupa un registro en un grupo. Hoy quiero hablarles sobre otra función que también operan sobre grupos siguiendo un criterio determinado: SUM.

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ónMesImporteSaldo
11100.00100.00
21-10.0090.00
32-20.0070.00


La forma de lograrlo es simple:

SELECT
Transaccion,
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
Transaccion,
Importe,
SUM(Importe) OVER (PARTITION BY Mes ORDER BY Transaccion) Saldo

FROM Movimientos





TransacciónMesImporteSaldo
11100.00100.00
21-10.0090.00
32-20.00-20.00

1 comentario:

Anónimo dijo...

el Order By no aplica en esta sintaxis.
Da error.