Как рассчитать дебетовое и кредитное сальдо с функцией задержки - PullRequest
0 голосов
/ 19 января 2019

у меня есть некоторые данные в моей таблице 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

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Используйте формат S и 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
0 голосов
/ 19 января 2019

Вы можете попробовать использовать 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 |
...