簡體   English   中英

如何使用滯后功能計算借方和貸方余額

[英]How to calculate debit and credit running balance with lag function

我的表accounting有一些數據。

     ID EDATE     DISCRIPTION      DR         CR     
    --- --------- ------------- ---------- ------  
     1 19-JAN-19 cash in           1000       0       
     2 19-JAN-19 cash out             0     200 
     3 19-JAN-19 cash in            500       0       
     4 19-JAN-19 cash out             0     200        
     5 19-JAN-19 cash out             0     200        
     6 19-JAN-19 cash out             0    1800

我想獲得如下的借方余額和貸方余額余額

     ID      EDATE    DISCRIPTION      DR  CR      BALANCE
    --- --------- -------------     ------ ------ ----------
     1 19-JAN-19 cash in           1000       0       1000dr
     2 19-JAN-19 cash out             0     200        800dr
     3 19-JAN-19 cash in            500       0       1300dr
     4 19-JAN-19 cash out             0     200       1100dr 
     5 19-JAN-19 cash out             0     200        900dr
     6 19-JAN-19 cash out             0    1800      (900)cr

我試圖用LAG FUNCITON做到這一點,但是失敗了,我的代碼在下面

select id,edate,discription,dr,cr,
dr-lag(dr,1,0)
over(order by id) as balance 
from accounting;

我的輸出是

ID   EDATE     DISCRIPTION             DR     CR    BALANCE
--- --------- -------------           ------- ----  -------
     1 19-JAN-19 cash in                    1000    0    1000
     2 19-JAN-19 cash out                      0  200   -1000
     3 19-JAN-19 cash in                     500    0     500
     4 19-JAN-19 cash out                      0  200    -500
     5 19-JAN-19 cash out                      0  200       0

您可以嘗試使用sum窗口功能。

CREATE TABLE accounting(
   ID int,
   EDATE varchar(50),
   DISCRIPTION varchar(50),
   DR int,
   CR int
);


INSERT INTO accounting VALUES (1,'19-JAN-19','cash in',1000,0);       
INSERT INTO accounting VALUES (2,'19-JAN-19','cash out',0,200); 
INSERT INTO accounting VALUES (3,'19-JAN-19','cash in',500,0);       
INSERT INTO accounting VALUES (4,'19-JAN-19','cash out',0,200);        
INSERT INTO accounting VALUES (5,'19-JAN-19','cash out',0,200);        
INSERT INTO accounting VALUES (6,'19-JAN-19','cash out',0,1800);

查詢1

select 
  id,
  edate,
  discription,
  dr,
  cr,
  sum(DR) over(order by id) - sum(CR) over(order by id)  as balance 
from accounting

結果

| ID |     EDATE | DISCRIPTION |   DR |   CR | BALANCE |
|----|-----------|-------------|------|------|---------|
|  1 | 19-JAN-19 |     cash in | 1000 |    0 |    1000 |
|  2 | 19-JAN-19 |    cash out |    0 |  200 |     800 |
|  3 | 19-JAN-19 |     cash in |  500 |    0 |    1300 |
|  4 | 19-JAN-19 |    cash out |    0 |  200 |    1100 |
|  5 | 19-JAN-19 |    cash out |    0 |  200 |     900 |
|  6 | 19-JAN-19 |    cash out |    0 | 1800 |    -900 |

使用格式 Sreplace所需的代碼replace標准的+/-符號

如果您的數字列不可為空,則可以省略NVL

聚合SUM函數通常與PARTITION BY一起使用以區分帳戶-請參閱查詢中的注釋。

with bal as (
select 
  id, cr, dr,
  sum(nvl(cr,0) - nvl(dr,0)) over (/* PARTITION BY account key */ ORDER BY id) as balance
from accounting)
select 
 id, dr db,cr,
 replace(replace(to_char(balance,'999,999.99S'),'+','CR'),'-','DB') balance
from bal 
order by id;

        ID         DB         CR BALANCE                                    
---------- ---------- ---------- ----------------
         1       1000          0   1,000.00DB                                 
         2          0        200     800.00DB                                 
         3        500          0   1,300.00DB                                 
         4          0        200   1,100.00DB                                 
         5          0        200     900.00DB                                 
         6          0       1800     900.00CR

暫無
暫無

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

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