Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Оборотно-сальдовая ведомость  [new]
Евгенич
Member

Откуда:
Сообщений: 274
Добрый день!

Прошу помочь написать запрос, показывающий оборотно-сальдовую ведомость по счету в разрезе дат.

create table #balance (
	 account int --счет
	,date int      --дата
	,in_  numeric(17,10)  --входящий остаток
	,debet numeric (17,10) --дебет
	,credit numeric (17,10) --кредит
	,out_ numeric (17,10)  --исходящий остаток
)

insert #balance
select 1,10001,50.32,1500.41,20500,19049.91
union
select 1,10002,19049.91,2000,0,17049.91
union
select 1,10003,17049.91,0,0,17049.91
union
select 1,10004,17049.91,0,10000,27049.91
union
select 1,10005,27049.91,20000,0,7049.91



нужно вывести одну строку: Входящий остаток на начало периода, дебет за период,кредит за период,исходящий остаток на конец периода

Вот результат для запроса с даты 10001 по дату 10004:

1,50.32,3500.41,30500,27049.91


Заранее благодарен за советы!
11 сен 15, 11:17    [18136642]     Ответить | Цитировать Сообщить модератору
 Re: Оборотно-сальдовая ведомость  [new]
xenix
Guest
Как-то так, только не бить :-)

SELECT DISTINCT B.ACCOUNT,INCOME.in_,
TurnOver.DEBET,TurnOver.CREDIT,
OUTT.out_
 FROM #balance B
 CROSS APPLY
 (
   SELECT TOP 1 IN_
    FROM #balance B1
     WHERE B1.account=B.account
     ORDER BY [DATE]ASC
 )INCOME
 LEFT JOIN
 (
   SELECT A.account,SUM(A.debet)DEBET,SUM(A.credit)CREDIT
   FROM #balance A
   GROUP BY A.account
 )TurnOver ON B.account=TurnOver.account
 CROSS APPLY
 (
   SELECT TOP 1 out_
    FROM #balance B1
     WHERE B1.account=B.account
     ORDER BY [DATE]DESC
 )OUTT
11 сен 15, 11:29    [18136755]     Ответить | Цитировать Сообщить модератору
 Re: Оборотно-сальдовая ведомость  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
declare @dt_from int = 10001
      , @dt_to   int = 10004

select sum(case when date = @dt_from then  in_  else 0 end ) in_
     , sum(debet) debet
     , sum(credit) credit 
     , sum(case when date = @dt_to then  out_  else 0 end ) out_
from #balance
where date between @dt_from and @dt_to
11 сен 15, 11:30    [18136758]     Ответить | Цитировать Сообщить модератору
 Re: Оборотно-сальдовая ведомость  [new]
Евгенич
Member

Откуда:
Сообщений: 274
Всем спасибо. Оба варианта дают то что нужно.
Забыл сказать про специфику таблицы. В реальной ситуации может не быть записи за дату 10004 (если не было движений по счету). Тогда нужно анализировать предыдущую запись и брать значение out из нее. В этом случае вариант, предложенный Knyazev Alexey не сработает? Или я не прав?
11 сен 15, 11:51    [18136958]     Ответить | Цитировать Сообщить модератору
 Re: Оборотно-сальдовая ведомость  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
declare @dt_from int = 10001
      , @dt_to   int = 10004

select ( select top 1 in_ from #balance where date between @dt_from and @dt_to order by date ) in_
     , sum(debet) debet
     , sum(credit) credit 
     , ( select top 1 out_ from #balance where date between @dt_from and @dt_to order by date desc )  out_
from #balance t
where date between @dt_from and @dt_to
11 сен 15, 11:55    [18136987]     Ответить | Цитировать Сообщить модератору
 Re: Оборотно-сальдовая ведомость  [new]
Евгенич
Member

Откуда:
Сообщений: 274
Knyazev Alexey
declare @dt_from int = 10001
      , @dt_to   int = 10004

select ( select top 1 in_ from #balance where date between @dt_from and @dt_to order by date ) in_
     , sum(debet) debet
     , sum(credit) credit 
     , ( select top 1 out_ from #balance where date between @dt_from and @dt_to order by date desc )  out_
from #balance t
where date between @dt_from and @dt_to



Алексей, спасибо!
11 сен 15, 11:57    [18136997]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить