Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите с запросом  [new]
02062016
Guest
Здравствуйте !
Помогите пожалуйста составить запрос
Есть табличка с регистрацией вагонов
NumberWagonStateWagonDate
1прибыл(1)01.06.2016
1убыл(2)02.06.2016
1прибыл(1)05.06.2016
1убыл(2)10.06.2016
1прибыл(1)20.06.2016
2прибыл(1)03.06.2016


declare @Tmp table(NumberWagon int, StateWagon int, ADate smalldatetime)
insert into @Tmp
select 1,1,'20160601' union
select 1,2,'20160602' union
select 1,1,'20160605' union
select 1,2,'20160610' union
select 1,1,'20160620' union
select 2,1,'20160603'


Нужно получить следующее
NumberWagon MoveIn MoveOut
101.06.201602.06.2016
105.06.201610.06.2016
120.06.2016null
203.06.2016null

то есть для прибывшего вагона подставить ближайшую дату убытия.
2 июн 16, 09:02    [19248373]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
02062016,

можно так, главное что бы вагон хоть раз прибыл :)

SELECT 
	a.NumberWagon,
	a.ADate		as Income,
	x.OutCome	as OutCome
FROM @Tmp	a
CROSS  APPLY
(
	SELECT MIN(Adate) as OutCome
	FROM @Tmp	x	 
	WHERE 
		x.NumberWagon = a.NumberWagon	AND
		StateWagon = 2			AND
		x.Adate >= a.ADate
) as x
WHERE 
	a.StateWagon = 1
2 июн 16, 09:15    [19248407]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
02062016
Guest
Сделал через курсор, но цикл мне совсем не наравится
declare @Tmp table(NumberWagon int, StateWagon int, ADate smalldatetime)
insert into @Tmp(NumberWagon, StateWagon, ADate)
select 1,1,'20160601' union
select 1,2,'20160602' union
select 1,1,'20160605' union
select 1,2,'20160610' union
select 1,1,'20160620' union
select 2,1,'20160603'

declare @Res table(Id int identity,NumberWagon int, DateIn smalldatetime, DateOut smalldatetime)
declare @Id int

insert into @Res(NumberWagon, DateIn)
select NumberWagon,ADate
  from @Tmp
 where StateWagon = 1
 order by NumberWagon

declare ACursor cursor for select Id from @Res for update
open ACursor

fetch next from ACursor into @Id
while @@FETCH_STATUS=0 begin
  update @Res
    set DateOut = (select min(T.ADate)
                     from @Res R, @Tmp T  
                    where Id = @Id and
                          R.NumberWagon = T.NumberWagon and
                          T.StateWagon = 2 and
                          R.DateIn < T.ADate)
  where ID = @Id
  fetch next from ACursor into @Id
end

select *
from @Res
2 июн 16, 09:21    [19248422]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
02062016,

ну так-то точно разницы с указанным нет :)
2 июн 16, 09:25    [19248435]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
02062016
Guest
Спасибо большое. Ваше решение красивое и компактное (не знал про CROSS APPLY )
2 июн 16, 09:32    [19248459]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить