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

Откуда: Москва
Сообщений: 598
Версия
Microsoft SQL Server 2005 - 9.00.4035.00 (X64)   Nov 24 2008 16:17:31   Copyright (c) 1988-2005 Microsoft Corporation  Enterprise Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2) 
Есть запрос
Select o.identifier,o.motion,o.masterid,o.dateout, o.docid
from table1 as t
inner join
table2 as o with(nolock) on t.identifier=o.identifier and o.dateout>=t.d
where  isnull(o.deleted,0)=0 
order by identifier,dateout,docid

он возвращает таблицу:
identifiermotionmasteriddateout docid
12345 -155521.05.200910755
12345188821.05.200910755
12345-188825.05.200911145
12345177725.05.200911145
56565-145619.05.200934234
56565188919.05.200934234
56565-188915.05.200923422
56565166615.05.200923422
67676-134523.05.200978675
67676188823.05.200978675
67676-188815.06.200922334
67676166615.06.200922334
67676-166618.06.200945432
67676144418.06.200945432
78789-165424.05.200912321
78789188924.05.200912321
78789-154427.05.200924567


где identifier -это штрих код, motion- это ушёл/пришёл, masterid- это номер склада (откуда/куда), dateout- это дата когда он ушёл/пришёл. docid- это номер документа

Мне нужны склады только
where masterid in (888,889)
т.е. я вижу допустим: штрих код 12345, он ушёл со склада 555, и пришел на склад 888- это одна операция, она проводится одной датой. Потом через 4 дня, штрих код уходит со склада 888 на склад 777, это другая операция. Т.е. штрих код 12345 пришёл на склад 888 и ушёл оттуда в течении 4 дней. это нормально. Бывает и такое: штрих код 56565, пришёл на склад 889, 19.05.2009, а ушёл 15.05.2009, это тоже нормально..просто ушёл штрих код задним числом..

А мне нужно выявить такие штрих кода, которые пришли на склады 888 или 889, и которые не ушли с него, либо ушли,но после 10 дней, со дня прихода на склад..
т.е. из данного запроса подходят Штрих код 67676, он пришёл на склад 888 23.05.2009, а ушёл оттуда спустя 2 недели, аж 15.06.2009, и штрих код 78789, который пришел на склад 889, но с него так и не уходил.


т.е. на экран вывести
identifiermasteriddateout_Prihodadateout_Uhoda docid_Prihoddocid_Uhod
6767688823.05.200915.06.20097867522334
7878988924.05.2009null12321null
20 ноя 09, 12:25    [7955803]     Ответить | Цитировать Сообщить модератору
 Re: Агрегатная функция для дат  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Как-то так?
with cte as
(
 Select o.identifier,o.motion,o.masterid,o.dateout, o.docid
 from table1 as t
 inner join
 table2 as o with(nolock) on t.identifier=o.identifier and o.dateout>=t.d
 where  isnull(o.deleted,0)=0
 and o.masterid in(888,889)
)
select *
from cte
where cte.motion=1
and not exists(select * from cte t where t.identifier=cte.identifier and t.motion=-1 and t.dateout<=dateadd(day,10,cte.dateout)
order by identifier,dateout,docid;
20 ноя 09, 12:37    [7955910]     Ответить | Цитировать Сообщить модератору
 Re: Агрегатная функция для дат  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iap,

а при чём здесь "Агрегатная функция для дат" - так и не понял.
20 ноя 09, 12:46    [7955983]     Ответить | Цитировать Сообщить модератору
 Re: Агрегатная функция для дат  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
iap
iap,

а при чём здесь "Агрегатная функция для дат" - так и не понял.

я просто по другому хотел запрос написать..

Select o.identifier,sum(o.motion) as m ,o.masterid,aggregate_function(o.dateout) as d, max(o.docid) as docid
 from table1 as t
 inner join
 table2 as o with(nolock) on t.identifier=o.identifier and o.dateout>=t.d
 where  isnull(o.deleted,0)=0
 and o.masterid in(888,889)
group by o.identifier,o.masterid
having sum(o.motion)<>0 or aggregate_function(o.dateout)>10
где aggregate_function некая агрегированная функция которая считает разницу между датами..
20 ноя 09, 12:52    [7956028]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить