sql - 甲骨文(10) SQL : calculating final sum depending on two field

标签 sql oracle sum cumulative-sum

首先是免责声明:我在学校里从未学过任何编程,只是必须处理各种 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:

  1. BAL1 AMT 必须从 BAL1 中减去或相加,直到 BAL1 == 0(并且 BAL2 > 0)
  2. 如果 BAL1 达到 0,则必须从 BAL2 中减去 BAL1 的余数(如果有)
  3. 如果 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/

相关文章:

java.io.InvalidClassException : oracle. jdbc.rowset.OracleCachedRowSet

mysql - 如何对三个 mysql 表中的列进行求和?

Mysql查询总和并求平均值

mysql - 如何使用命令行过程继续导入带有剩余数据的sql文件?

mysql - 日期列表和另一个表的交叉连接

c# - Linq-To-Sql 将字符串转换为具有特定格式的日期

mysql - Cakephp 查找 ('list' ) 与汇总数据返回空值

sql - 如何通过每个产品单行的产品获得不同的价格

sql - 甲骨文 SQL : Selecting data and partition name from table and truncating partitions

linux - Oracle DB 不接受阿拉伯字符