Utilice la función LAG de Oracle para realizar cálculos con los datos.
Quiero obtener STOCK y el costo promedio ponderado por unidad (WAUC).
TABLA T1:
ROW | ITEM | IN | OUT | PRICE | STOCK | WAUC |
---|---|---|---|---|---|---|
1 | A | 1000 | – | 20 | 1000 | 20 |
2 | A | 2000 | – | 25 | – | – |
3 | A | 1500 | – | 15 | – | – |
4 | A | 500 | – | 20 | – | – |
Tengo las primeras 5 columnas y los primeros dos registros de las últimas dos columnas, y quiero obtener el resto de las últimas dos columnas: STOCK y WAUC.
WAUC = ((PRECIO_ANTERIOR * STOCK_ANTERIOR) + (ENTRADA_ACTUAL * PRECIO_ACTUAL)) / STOCK_ACTUAL
Entonces, escribo la consulta:
SELECT ROW,
SUM(IN - OUT) OVER(ORDER BY ROW) STOCK,
((LAG(STOCK * WAUC) OVER (ORDER BY ROW)) + (IN * PRICE)) / STOCK AS WAUC
FROM T1
Lo que quiero es:
ROW | ITEM | IN | OUT | PRICE | STOCK | WAUC |
---|---|---|---|---|---|---|
1 | A | 1000 | – | 20 | 1000 | 20 |
2 | A | 2000 | – | 25 | 3000 | 23.33 |
3 | A | 1500 | – | 15 | 4500 | 20.55 |
4 | A | 500 | – | 20 | 5000 | 20.49 |
En otras palabras, quiero usar los resultados de LAG en el cálculo de los datos.
davy.ai
Para obtener las columnas
STOCK
yWAUC
, utilizaré la fórmulaWAUC = ((PREVIOUS_PRICE * PREVIOUS_STOCK) + (CURRENT_IN * CURRENT_PRICE)) / CURRENT_STOCK
.Primero, seleccionaré las columnas
ROW
,IN
,OUT
,PRICE
y realizaré el cálculo para obtener la columnaSTOCK
utilizando la funciónSUM
con la cláusulaOVER
.Luego, utilizaré la función
LAG
para acceder a los valores anteriores deSTOCK
yWAUC
, y realizaré el cálculo necesario para obtener el valor actual deWAUC
.La consulta final para obtener la salida deseada es:
La salida será:
donde las columnas
STOCK
yWAUC
se han calculado en base a la fórmula utilizando la funciónLAG
.