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

Откуда:
Сообщений: 990
Здравствуйте. есть 2 таблицы. 1 - остатки, 2 - движения (приход, расход). В первой таблице хранятся остатки по Контрагентам и Договорам, во второй таблице хранятся фактические движения, т.е. все приходы и расходы по каждому документу (таблица документов). Вопрос такой, Делается запрос по таблице остатков, получаются остатки и теперь надо найти первейший документ, на котором возникает остаток больше 0. Вот запрос получения остатков:
SELECT
Контрагент,
Договор,
СуммаДолга
FROM ТаблицаОстатков

А вот запрос по получению движений:
SELECT
Контрагент,
Договор,
Документ,
ДатаДокумента,
СуммаОборот
FROM ТаблицаДвижений

Теперь надо как-то эти 2 таблицы объединить, чтобы получить остаток из таблицы остатков и отнять от нее все Обороты с таблицы оборотов до даты документу, включая текущий документ. Помогите пожалуйста написать наиболее оптимальный запрос для получения таких остатков. Спасибо.
10 июл 18, 10:33    [21558495]     Ответить | Цитировать Сообщить модератору
 Re: Получить остаток на документ в обратном порядке по дате документа?  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Pvase,

 Declare @ТаблицаОстатков table
 (
Контрагент int,
Договор int,
СуммаДолга money
 )
insert into @ТаблицаОстатков values (1,1,-1000),(1,2,-2000);

Declare @ТаблицаДвижений table 
(
Контрагент int,
Договор int,
Документ int,
ДатаДокумента date,
СуммаОборот money
)

insert into @ТаблицаДвижений values 
(1,1,1,'20180101',500),
(1,1,2,'20180201',500),
(1,1,2,'20180301',-50),
(1,1,3,'20180310',100),
(1,1,3,'20180401',200),
(1,2,4,'20180101',500),
(1,2,5,'20180201',500),
(1,2,6,'20180301',800),
(1,2,7,'20180401',300);

With НарастающийИтог as
(
Select *,sum(СуммаОборот) Over (Partition by Контрагент,Договор Order by ДатаДокумента, СуммаОборот Desc) as СуммаПредДвижений
From @ТаблицаДвижений
)
Select top 1 With Ties 
* From @ТаблицаОстатков a
left join НарастающийИтог b on a.Контрагент = b.Контрагент and a.Договор = b.Договор
Where a.СуммаДолга+isnull(b.СуммаПредДвижений,0)>0
Order by row_number() Over (Partition by a.Контрагент,a.Договор Order by b.ДатаДокумента, b.СуммаОборот)
10 июл 18, 11:05    [21558592]     Ответить | Цитировать Сообщить модератору
 Re: Получить остаток на документ в обратном порядке по дате документа?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7780
Pvase,

FAQ нарастающий итог.
10 июл 18, 12:28    [21558937]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить