2014-01-28 3 views
0

привет я следующую таблицу и данные, чтобы получить открытия и закрытия баланса каждый счет открытия необходимый баланс gdate < 02-октября-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 
+2

Если у вас есть сценарии ddl для задействованных таблиц, это может сэкономить кому-то некоторое время, отвечая на этот вопрос, и означает, что они не догадываются о типах данных и т. Д. Лично я считаю, что SQL Fiddle весьма полезен для обмена такими вещами: http://sqlfiddle.com/ – ChrisProsser

+0

вот структура таблицы create table bookger (account_no varchar2 (10), дата gdate, дебетовый номер (8), номер кредита (8)) – user3244687

+0

Пожалуйста, можете ли вы также объяснить, что было не так с результатом. Сколько строк вы ожидали? Если у вас есть DML, образец этих данных также будет полезен. – ChrisProsser

ответ

1

Это скорее комментарий, потому что он не отвечает на вопрос. Ваш запрос упрощается до:

Select account_no, LAG(closing, 1 ,0) OVER (order by account_no) as opening, 
     debit, credit, 
     (LAG(closing,1,0) OVER (order by account_no)+ closing) as closing 
from (select account_no, 0 as OPEN, SUM(debit) as debit, SUM(credit) as credit, 
      sum(debit) - sum(credit) as closing 
     FROM ledger 
     where gdate > '20-oct-13' 
     group by account_no 
    ) a; 

Некоторые примечания. order by в подзапросе или CTE не является полезным, если вы не выбрали rownum в следующем внешнем запросе. Если вы хотите, чтобы результаты были заказаны, тогда во внешнем запросе введите order by.

Сам запрос не имеет смысла. Почему начальный баланс исходит из предыдущего номера счета? Обычно такая терминология используется для дат на конкретной учетной записи, и вы исключили все даты в предложении group by.

+0

одинаковый результат открытия и закрытия всегда показывает 0 ноль – user3244687

+1

@ пользователь3244687. , , Как уже упоминалось, я не изменил ваш запрос. Я просто прокомментировал, что это не имеет смысла. Почему вы берете баланс с другого аккаунта? –

1

Вы постоянно менять свои требования, но, основываясь на том, что вы показали, на данный момент, это работает:

select account_no, 
max(opening) keep (dense_rank first order by gdate) as opening, 
sum(debit) as debit, 
sum(credit) as credit, 
max(closing) keep (dense_rank first order by gdate desc) as closing 
from (
select account_no, gdate, credit, debit, 
lag(balance, 1, 0) over (partition by account_no order by gdate) as opening, 
balance as closing 
from (
    select account_no, gdate, debit, credit, 
    sum(debit) over (partition by account_no order by gdate) as sum_debit, 
    sum(credit) over (partition by account_no order by gdate) as sum_credit, 
    sum(credit) over (partition by account_no order by gdate) 
    - sum(debit) over (partition by account_no order by gdate) as balance 
    from ledger 
) 
) 
where gdate > date '2013-10-02' 
group by account_no 
order by account_no; 

Что это та же логика я связан раньше, когда вы были разные данные. SQL Fiddle.

Я не уверен, почему вы показываете свой баланс открытия как позитивный; кажется неправильным, когда все, что у вас есть, являются дебетовыми. Если это действительно то, что вы хотите, то просто поменять, как рассчитывается баланс:

... 
    sum(debit) over (partition by account_no order by gdate) 
    - sum(credit) over (partition by account_no order by gdate) as balance 
... 

SQL Fiddle.

Смежные вопросы