首先是免责声明:我在学校里从未学过任何编程,只是必须处理各种 SQL 问题(也)。
现在我有两个表,TABLE1:
ACCNO BAL1 BAL2
11111 20 10
TABLE2(当然有 ACCNO 键)将行与“11111”相关:
DATENUM AMT
1 -5
2 -10
3 8
4 -23
5 100
6 -120
7 140
现在我必须使用以下规则找到新的 BAL1 和 BAL2:
- BAL1 AMT 必须从 BAL1 中减去或相加,直到 BAL1 == 0(并且 BAL2 > 0)
- 如果 BAL1 达到 0,则必须从 BAL2 中减去 BAL1 的余数(如果有)
- 如果 BAL2 也达到 0,则仅应修改 BAL1。
因此使用上述数据:
DATENUM AMT BAL1 BAL2
0 0 20 10 /*starting record*/
1 -5 15 10
2 -10 5 10
3 8 13 10
4 -23 0 0
5 100 100 0
6 -120 -20 0
7 140 120 0
我需要最后两个 BAL1 和 BAL2。
如何使用 (Oracle 10) SQL 计算它们?
最佳答案
我想我会用 PL/SQL 来做到这一点:
DECLARE
v_bal1 table1.bal1%TYPE;
v_bal2 table1.bal2%TYPE;
v_accno table1.accno%TYPE;
BEGIN
v_accno := 11111;
SELECT bal1, bal2
INTO v_bal1, v_bal2
FROM table1
WHERE accno = v_accno;
FOR c IN ( SELECT amt
FROM table2
WHERE accno = v_accno
ORDER BY datenum )
LOOP
v_bal1 := v_bal1 + c.amt;
IF( v_bal1 < 0 AND v_bal2 > 0 ) THEN
v_bal2 := v_bal2 + v_bal1; --# v_bal1 < 0, so "add" to v_bal2
IF( v_bal2 < 0 ) THEN
v_bal1 := v_bal1 + v_bal2; --# "remove" remainder
v_bal2 := 0;
ELSE
v_bal1 := 0;
END IF;
END IF;
END LOOP;
dbms_output.put_line( v_bal1 || ', ' || v_bal2 );
END;
此输出
120, 0
看起来您的最后一行是错误的,添加了 40
而不是 140
。
关于sql - 甲骨文(10) SQL : calculating final sum depending on two field,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2607814/