簡體   English   中英

根據貸記和借記記錄計算余額

[英]Calculate balance from Credit and Debit records

我的數據庫表中有以下記錄:

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

我想計算並顯示每條記錄的余額,如下所示:

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

任何人都可以幫助我實現上述結果嗎?

要生成余額,請在分析版本中使用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

如果您的表包含增加的主鍵,您可以使用它而不是生成的行號。

測試數據和輸出:

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

您應該能夠為此使用LAG分析函數來查看前一行的數據。

SELECT Date, 
       Credit, 
       Debit, 
       LAG(Balance, 1, 0) OVER(ORDER BY Date) - Debit + Credit AS Balance, 
       Description
  FROM sometable

1參數表示它看起來在前 1 行, 0參數表示如果給定偏移處的行不存在,它將返回 0(即第一行)。

來源: https ://oracle-base.com/articles/misc/lag-lead-analytic-functions

試試這個,首先進行自連接,然后按順序列出結果:

SELECT a1.Date, a1.Debit, a1.Credit, SUM(a2.Debit-a2.Credit) Balance, Description
FROM table a1, table a2
WHERE a1.debit<=a2.debit and a1.credit<=a2.credit OR (a1.debit=a2.debit and a1.credit=a2.credit and a1.date = a2.date)
GROUP BY a1.Date, a1.Debit, a1.Credit
ORDER BY a1.Date DESC;

對於誰可能會看到mssql的這個問題,你可以使用這個查詢:

select tdate, credit, debit, 
       sum(isnull(credit, 0)-isnull(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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM