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

Откуда: Москва
Сообщений: 606
версия
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_Фирма
АбаканИП Иванов23000ооо "ювэст"12
АбаканИП Иванов25000ооо "вилмар"13
АбаканИП Петров31000ооо "ювэст"12
ВолгоградООО "Ножи"42000ооо "ювэст"12
Сочи ЗАО "Медвед"231000ооо "вилмар"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Бородач А.Р.12345612.5.2011400000ооо "ювэст"12
АбаканИп Иванов2Бородач А.Р.12345713.5.2011010000ооо "ювэст"12
АбаканИп Иванов2Бородач А.Р.12345815.5.2011200000ооо "ювэст"12
АбаканИп Иванов2Ренатов А.З.12243611.5.201100500ооо "вилмар"13
Волгоградооо "Ножи"4Сидоров С.С.12223212.5.2011010000ооо "ювэст"12
Волгоградооо "Ножи"4Сидоров С.С.14625212.5.2011010000ооо "Вилмар"13


Как объединить эти два запроса, чтобы привести его к такому виду..Т.е. как пересчитывать долг для каждой строки?
ГородКлиент ID_КлиентаМенеджер[Номер документа][Дата документа]Остаток на началоОтгрузка ВозвратОплатаОстаток на конецФирмаId_Фирма
АбаканИп Иванов2Бородач А.Р.12345612.5.201130004000007000ооо "ювэст"12
АбаканИп Иванов2Бородач А.Р.12345713.5.201170000100006000ооо "ювэст"12
АбаканИп Иванов2Бородач А.Р.12345815.5.201160002000008000ооо "ювэст"12
АбаканИп Иванов2Ренатов А.З.12243611.5.20115000005004500ооо "вилмар"13
Волгоградооо "Ножи"4Сидоров С.С.12223212.5.201120000100001000ооо "ювэст"12
Волгоградооо "Ножи"4Сидоров С.С.14625212.5.20110010000-1000ооо "Вилмар"13
Сочи ЗАО "Медвед"23Бородач А.Р.10000001000ооо "вилмар"13


Формула для пересчета:
Остаток на конец=Остаток на начало+Отгрузка-Возврат-Оплата 
и Остаток на конец первой строки, является Остатком на начало следующей. Упорядочивается по Docid. т.к. Docid идет по возрастанию. Пересчет остатка осуществляется в пределах одного клиента, менеджера, фирмы. Если у клиента в этот период не было движений (отгрузок,возвратов и оплат), а долг висит, то дублировать долг.
1 июн 11, 17:53    [10747875]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Philin
Member

Откуда: г. Иркутск
Сообщений: 162
Это?
https://www.sql.ru/faq/faq_topic.aspx?fid=125
2 июн 11, 07:51    [10749888]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 606
Philin, Вряд ли тут подойдет нарастающий итог. Я же не суммирую к предыдущей строке, следующую..Мне нужно пересчитать остаток. А конечный остаток предыдущей строки, перенести на начало следующей.
2 июн 11, 08:51    [10749997]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Philin
Member

Откуда: г. Иркутск
Сообщений: 162
Ну так и объединяйтесь с предыдущей строкой таблицы.
Как-то так:
SELECT 1 id_, 1000 Num
 INTO #TableTest
UNION
SELECT 2 id_, 1200 Num
UNION
SELECT 3 id_, 1600 Num

SELECT t.id_, t.Num, t_prev.Num Prev_Num
FROM #TableTest t
 LEFT JOIN #TableTest t_prev ON t_prev.id_ = t.id_ - 1
 
 DROP TABLE #TableTest
2 июн 11, 08:59    [10750021]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Philin
Member

Откуда: г. Иркутск
Сообщений: 162
Т.е. в вашем случае, упрощенно должно получиться что-то типа такого:
SELECT 1 klient_ID, 1 DocID, 1000 Num
 INTO #TableTest
UNION
SELECT 2 klient_ID, 2 DocID, 1200 Num
UNION
SELECT 1 klient_ID, 7 DocID, 1600 Num
UNION
SELECT 2 klient_ID, 9 DocID, 1600 Num

SELECT t.klient_ID, t.DocID, t.Num, 
 (select top 1 Num from #TableTest t_prev where t.klient_ID = t_prev.klient_ID and t.DocID > t_prev.DocID order by t_prev.DocID desc) Prev_Num
FROM #TableTest t
 
 DROP TABLE #TableTest
2 июн 11, 09:08    [10750073]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить