2014-01-29 28 views
-2

您好我有以下表和數據獲取開的每期末餘額開戶平衡所需gdate < 02-OCT-2013,這裏是我的表查詢用於打開和關閉餘額在Oracle

create table ledger (account_no varchar2(10),gdate date,debit number(8),credit number(8)) 

insert into ledger (account_no,gdate,debit,credit) values ('10-0001','01-oct-2013',1000,0); 
insert into ledger (account_no,gdate,debit,credit) values ('10-0001','24-oct-2013',0,440); 
insert into ledger (account_no,gdate,debit,credit) values ('20-0001','01-oct-2013',3000,0); 
insert into ledger (account_no,gdate,debit,credit) values ('30-0001','01-oct-2013',300,0); 
insert into ledger (account_no,gdate,debit,credit) values ('20-0001','16-oct-2013',1200,0); 
insert into ledger (account_no,gdate,debit,credit) values ('30-0001','17-oct-2013',0,1340); 
insert into ledger (account_no,gdate,debit,credit) values ('30-0001','24-oct-2013',500,0); 

我需要結果如下

ACCOUNT_NO OPENING DEBIT CREDIT CLOSING 
10-0001 1000 0  440 560 
20-0001 3000 1200  0 4200 
30-0001  300 500 1340 540 
+0

老闆輸出是不夠的..試圖闡明你想要什麼... – Sai

+0

請不要[問相同的問題兩次](http://stackoverflow.com/q/21407259/266304)。 –

回答

1

試試這個:

with tab as (select l.*, 
        dense_rank() over (partition by l.account_no order by l.gdate) min_date 
       from ledger l), 
tab2 as (select tab.*, 
       sum(case when min_date <> 1 then debit else 0 end) over (partition by account_no) t_debit, 
       sum(case when min_date <> 1 then credit else 0 end) over (partition by account_no) t_credit 
      from tab) 
select ACCOUNT_NO , 
     DEBIT as opening, 
     T_DEBIT as DEBIT, 
     T_CREDIT as CREDIT, 
     (DEBIT + T_DEBIT - T_CREDIT) closing 
    from tab2 
where min_date = 1; 

輸出繼電器:

| ACCOUNT_NO | OPENING | T_DEBIT | T_CREDIT | CLOSING | 
|------------|---------|---------|----------|---------| 
| 10-0001 | 1000 |  0 |  440 |  560 | 
| 20-0001 | 3000 | 1200 |  0 | 4200 | 
| 30-0001 |  300 |  500 |  1340 | -540 | 

然而,在你插圖,收盤爲去年賬號是540,但它應該是-540

編輯: 如果特定日期輸出ID所需那麼:

with tab as (select l.ACCOUNT_NO, 
        sum(case when gdate < '02-OCT-2013' then (debit - credit) else 0 end) opening, 
        sum(case when gdate >= '02-OCT-2013' then debit else 0 end) t_debit, 
        sum(case when gdate >= '02-OCT-2013' then credit else 0 end) t_credit 
       from ledger l 
       group by l.ACCOUNT_NO) 
select ACCOUNT_NO , 
     opening, 
     T_DEBIT as debit, 
     T_CREDIT as credit, 
     (opening + T_DEBIT - T_CREDIT) closing 
    from tab 
order by 1; 
+0

優秀的工作san工作perfectly非常感謝很多 – user3244687

+0

聖如果gdate <'02/10/2013'超過多個條目比它顯示多個結果 – user3244687

+0

是否像你使用gdate <'02/10/2013'條件爲期初餘額只爲每個月?我不明白這種情況的使用情況。 – San

0

嘗試......

SELECT x.*, (x.Opening + x.Debit - x.Credit) as "CLOSING" 
FROM (
    SELECT l.ACCOUNT_NO as "ACCOUNT_NO", 
     (SELECT DEBIT FROM ledger l2 
     WHERE l2.ACCOUNT_NO = l.ACCOUNT_NO AND l2.gdate < '02/10/2013') as "OPENING" 
     SUM(l.DEBIT) as "DEBIT", SUM(l.CREDIT) as "CREDIT" 
    FROM ledger as l 
    GROUP BY l.ACCOUNT_NO 
) as x 
+0

此查詢顯示錯誤ORA-00923:未找到預期的FROM關鍵字 – user3244687

+0

這是無效的(標準)SQL。 –