【问题标题】:Query For Opening And Closing Balance In Oracle在 Oracle 中查询期初和期末余额
【发布时间】:2014-01-29 05:37:08
【问题描述】:

嗨,我有下表和数据来获取每个帐户开户余额所需的开户和期末余额

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

【问题讨论】:

标签: sql oracle oracle11g oracle10g


【解决方案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;

【讨论】:

  • san if gdate
  • 您是否使用 gdate
  • San 如果 10-0001 帐户在 2013 年 2 月 10 日之前有 10 条记录,它将所有借记贷记条目相加并显示在期初余额中
  • 检查答案,如果能解决您的问题,请告诉我。
【解决方案2】:

试试这个...

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

【讨论】:

  • 此查询显示错误 ORA-00923: FROM 关键字未在预期位置找到
  • 这是无效的(标准)SQL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-15
相关资源
最近更新 更多