你的公式应该是:
WAUC = (
PREVIOUS_WAUC * PREVIOUS_STOCK
+ (CURRENT_IN - CURRENT_OUT) * CURRENT_PRICE
)
/ CURRENT_STOCK
您可以使用MODEL 子句(通过一些额外的测量来简化计算):
SELECT "ROW", item, "IN", "OUT", price, stock, wauc
FROM t1
MODEL
DIMENSION BY ("ROW")
MEASURES (item, "IN", "OUT", price, 0 AS change, 0 AS stock, 0 AS total, 0 AS wauc)
RULES (
change["ROW"] = COALESCE("IN"[cv()], 0) - COALESCE("OUT"[cv()], 0),
stock["ROW"] = change[cv()] + COALESCE(stock[cv()-1], 0),
total["ROW"] = change[cv()] * price[cv()] + COALESCE(total[cv()-1], 0),
wauc["ROW"] = total[cv()] / stock[cv()]
);
或者,在 Oracle 12 中,使用 MATCH_RECOGNIZE:
SELECT "ROW",
item,
"IN",
"OUT",
price,
total_stock AS stock,
total_cost / total_stock AS wauc
FROM t1
MATCH_RECOGNIZE(
ORDER BY "ROW"
MEASURES
SUM(COALESCE("IN", 0) - COALESCE("OUT", 0)) AS total_stock,
SUM((COALESCE("IN", 0) - COALESCE("OUT", 0))*price) AS total_cost
ALL ROWS PER MATCH
PATTERN (all_rows+)
DEFINE
all_rows AS 1 = 1
)
或解析函数:
SELECT "ROW",
item,
"IN",
"OUT",
price,
SUM(COALESCE("IN",0) - COALESCE("OUT", 0)) OVER (ORDER BY "ROW")
AS stock,
SUM((COALESCE("IN",0) - COALESCE("OUT", 0))*price) OVER (ORDER BY "ROW")
/ SUM(COALESCE("IN",0) - COALESCE("OUT", 0)) OVER (ORDER BY "ROW")
AS wauc
FROM t1
其中,对于样本数据:
CREATE TABLE t1 ("ROW", ITEM, "IN", "OUT", PRICE, STOCK, WAUC) AS
SELECT 1, 'A', 1000, CAST(NULL AS NUMBER), 20, CAST(NULL AS NUMBER), CAST(NULL AS NUMBER) FROM DUAL UNION ALL
SELECT 2, 'A', 2000, NULL, 25, NULL, NULL FROM DUAL UNION ALL
SELECT 3, 'A', 1500, NULL, 15, NULL, NULL FROM DUAL UNION ALL
SELECT 4, 'A', 500, NULL, 20, NULL, NULL FROM DUAL;
所有输出:
| ROW |
ITEM |
IN |
OUT |
PRICE |
STOCK |
WAUC |
| 1 |
A |
1000 |
|
20 |
1000 |
20 |
| 2 |
A |
2000 |
|
25 |
3000 |
23.33333333333333333333333333333333333333 |
| 3 |
A |
1500 |
|
15 |
4500 |
20.55555555555555555555555555555555555556 |
| 4 |
A |
500 |
|
20 |
5000 |
20.5 |
注意:ROW、IN 和 OUT 是关键字,您不应将它们用作标识符,因为您必须在它们出现的任何地方使用带引号的标识符。
db小提琴here