версия
Microsoft SQL Server 2008 (SP2) - 10.0.4000.0 (X64) Sep 16 2010 19:43:16 Copyright (c) 1988-2008 Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
Есть два запроса. Первый запрос выдает сколько денег должен клиент фирме на определенную дату. Дата и фирма вводится пользователем.
select city,klient,klient_ID,dolg,firma,firma_ID
from Table
where dateDolg<@FirstDate and (firma=@firma or @firma='')
Вот результат запроса
| Город | Клиент | ID_Клиента | Долг | Организация | ID_Фирма | | Абакан | ИП Иванов | 2 | 3000 | ооо "ювэст" | 12 | | Абакан | ИП Иванов | 2 | 5000 | ооо "вилмар" | 13 | | Абакан | ИП Петров | 3 | 1000 | ооо "ювэст" | 12 | | Волгоград | ООО "Ножи" | 4 | 2000 | ооо "ювэст" | 12 | | Сочи | ЗАО "Медвед" | 23 | 1000 | ооо "вилмар" | 13 |
|
Второй запрос выдает все движения клиента в заданный период времени и по какой фирме.
Где Docid-это номер документа проведенной операции. Всего 3 операции это Отгрузка клиенту (Продажа на реализацию, или за наличку)-Otgr, Возврат изделий от клиента (брак)- Vzr, Оплата клиентом денег за товар-Oplt
SELECT City,klient,klient_ID,Manager,Docid,DateDoc,Otgr,Vzr,Oplt,Firma,Firma_ID
FROM [Table1]
WHERE DateDoc>=@FirstDate and DateDoc<dateadd(day,1,@LastDate) and (firma=@firma or @firma='')
Вот результат запроса
| Город | Клиент | ID_Клиента | Менеджер | [Номер документа] | [Дата документа] | Отгрузка | Возврат | Оплата | Фирма | Id_Фирма | | Абакан | Ип Иванов | 2 | Бородач А.Р. | 123456 | 12.5.2011 | 4000 | 0 | 0 | ооо "ювэст" | 12 | | Абакан | Ип Иванов | 2 | Бородач А.Р. | 123457 | 13.5.2011 | 0 | 1000 | 0 | ооо "ювэст" | 12 | | Абакан | Ип Иванов | 2 | Бородач А.Р. | 123458 | 15.5.2011 | 2000 | 0 | 0 | ооо "ювэст" | 12 | | Абакан | Ип Иванов | 2 | Ренатов А.З. | 122436 | 11.5.2011 | 0 | 0 | 500 | ооо "вилмар" | 13 | | Волгоград | ооо "Ножи" | 4 | Сидоров С.С. | 122232 | 12.5.2011 | 0 | 1000 | 0 | ооо "ювэст" | 12 | | Волгоград | ооо "Ножи" | 4 | Сидоров С.С. | 146252 | 12.5.2011 | 0 | 1000 | 0 | ооо "Вилмар" | 13 |
|
Как объединить эти два запроса, чтобы привести его к такому виду..Т.е. как пересчитывать долг для каждой строки?
| Город | Клиент | ID_Клиента | Менеджер | [Номер документа] | [Дата документа] | Остаток на начало | Отгрузка | Возврат | Оплата | Остаток на конец | Фирма | Id_Фирма | | Абакан | Ип Иванов | 2 | Бородач А.Р. | 123456 | 12.5.2011 | 3000 | 4000 | 0 | 0 | 7000 | ооо "ювэст" | 12 | | Абакан | Ип Иванов | 2 | Бородач А.Р. | 123457 | 13.5.2011 | 7000 | 0 | 1000 | 0 | 6000 | ооо "ювэст" | 12 | | Абакан | Ип Иванов | 2 | Бородач А.Р. | 123458 | 15.5.2011 | 6000 | 2000 | 0 | 0 | 8000 | ооо "ювэст" | 12 | | Абакан | Ип Иванов | 2 | Ренатов А.З. | 122436 | 11.5.2011 | 5000 | 0 | 0 | 500 | 4500 | ооо "вилмар" | 13 | | Волгоград | ооо "Ножи" | 4 | Сидоров С.С. | 122232 | 12.5.2011 | 2000 | 0 | 1000 | 0 | 1000 | ооо "ювэст" | 12 | | Волгоград | ооо "Ножи" | 4 | Сидоров С.С. | 146252 | 12.5.2011 | 0 | 0 | 1000 | 0 | -1000 | ооо "Вилмар" | 13 | | Сочи | ЗАО "Медвед" | 23 | Бородач А.Р. | | | 1000 | 0 | 0 | 0 | 1000 | ооо "вилмар" | 13 |
|
Формула для пересчета:
Остаток на конец=Остаток на начало+Отгрузка-Возврат-Оплата
и Остаток на конец первой строки, является Остатком на начало следующей. Упорядочивается по Docid. т.к. Docid идет по возрастанию. Пересчет остатка осуществляется в пределах одного клиента, менеджера, фирмы. Если у клиента в этот период не было движений (отгрузок,возвратов и оплат), а долг висит, то дублировать долг.