从贷记和借记记录计算余额

dxb*_*dev 1 sql database oracle oracle11g

我的数据库表中有以下记录:

Date            Credit  Debit      Description
--------------- ------- -------    ---------------
12-24-2015      5                  Purchased credit
12-20-2015              1          Consumed credit
12-15-2015      3                  Purchased credit
12-08-2015              1          Consumed credit
12-08-2015              1          Consumed credit
12-07-2015              1          Consumed credit
12-04-2015              1          Consumed credit
12-03-2015              1          Consumed credit
12-01-2015      5                  Purchased credit
Run Code Online (Sandbox Code Playgroud)

我想计算并显示每条记录的余额,如下所示:

Date         Credit  Debit   Balance  Description
------------ ------- ------- -------  ---------------
12-24-2015   5       0       7        Purchased credit
12-20-2015           1       2        Consumed credit
12-15-2015   3       0       3        Purchased credit
12-08-2015           1       0        Consumed credit
12-08-2015           1       1        Consumed credit
12-07-2015           1       2        Consumed credit
12-04-2015           1       3        Consumed credit
12-03-2015           1       4        Consumed credit
12-01-2015   5       0       5        Purchased credit
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助我实现上述结果吗?

Pon*_*ons 5

sum()在分析版本中产生天平使用。

select tdate, credit, debit, 
       sum(nvl(credit, 0)-nvl(debit, 0)) over (order by rn) balance, description
  from (
    select tdate, credit, debit, row_number() over (order by tdate) rn, description 
      from test)
  order by rn desc
Run Code Online (Sandbox Code Playgroud)

如果您的表包含增加的主键,您可以使用它代替生成的行号。

测试数据和输出:

create table test (tdate date, credit number(6), debit number(6), description varchar2(20));
insert into test values (date '2015-12-24', 5, null, 'Purchased credit');
insert into test values (date '2015-12-20', null, 1, 'Consumed credit');
insert into test values (date '2015-12-15', 3, null, 'Purchased credit');
insert into test values (date '2015-12-08', null, 1, 'Consumed credit');
insert into test values (date '2015-12-08', null, 1, 'Consumed credit');
insert into test values (date '2015-12-07', null, 1, 'Consumed credit');
insert into test values (date '2015-12-04', null, 1, 'Consumed credit');
insert into test values (date '2015-12-03', null, 1, 'Consumed credit');
insert into test values (date '2015-12-01', 5, null, 'Purchased credit');

TDATE        CREDIT   DEBIT    BALANCE DESCRIPTION
----------- ------- ------- ---------- --------------------
2015-12-24        5                  7 Purchased credit
2015-12-20                1          2 Consumed credit
2015-12-15        3                  3 Purchased credit
2015-12-08                1          0 Consumed credit
2015-12-08                1          1 Consumed credit
2015-12-07                1          2 Consumed credit
2015-12-04                1          3 Consumed credit
2015-12-03                1          4 Consumed credit
2015-12-01        5                  5 Purchased credit
Run Code Online (Sandbox Code Playgroud)