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

Откуда:
Сообщений: 145

Есть отпуска, есть отзывы из отпусков, нужно найти даты начала и окончания отпусков с учетом отзывов:

-- отпуска

create table #vac (
id_vac int,
fromd datetime,
tod datetime
)
insert into #vac (id_vac,fromd,tod) values (1,'2004-04-17','2004-05-10')
insert into #vac (id_vac,fromd,tod) values (2,'2004-05-20','2004-05-30')
insert into #vac (id_vac,fromd,tod) values (3,'2004-06-01','2004-06-03')
insert into #vac (id_vac,fromd,tod) values (4,'2004-06-10','2004-06-15')

--отзывы из отпуска

create table #vac_back (
id_back int,
fromd datetime,
tod datetime,
id_vac int
)
insert into #vac_back (id_back,fromd,tod,id_vac) values (1,'2004-04-26','2004-04-27',1)
insert into #vac_back (id_back,fromd,tod,id_vac) values (2,'2004-04-30','2004-05-05',1)
insert into #vac_back (id_back,fromd,tod,id_vac) values (3,'2004-05-20','2004-05-21',2)
insert into #vac_back (id_back,fromd,tod,id_vac) values (4,'2004-05-22','2004-05-22',2)
insert into #vac_back (id_back,fromd,tod,id_vac) values (5,'2004-06-01','2004-06-03',3)
-- отзывы не могут пересекаться между собой, даты начала и окончания отзывов не могут выходить за пределы отпуска,

-- к которому они относятся


select * from #vac
select * from #vac_back

Нужен такой результат.

id_vac fromd tod
1 2004-04-17 2004-04-25
1 2004-04-28 2004-04-29
1 2004-05-06 2004-05-10
2 2004-05-23 2004-05-30
4 2004-06-10 2004-06-15
12 апр 04, 14:55    [624013]     Ответить | Цитировать Сообщить модератору
 Re: Не поможете запросик составить...?  [new]
paparome
Member

Откуда: Москва
Сообщений: 4312
Запись с id_back = 5 не удовлетворяет вашим же условиям :(
12 апр 04, 15:52    [624199]     Ответить | Цитировать Сообщить модератору
 Re: Не поможете запросик составить...?  [new]
paparome
Member

Откуда: Москва
Сообщений: 4312
Сорри, был не прав
12 апр 04, 15:53    [624202]     Ответить | Цитировать Сообщить модератору
 Re: Не поможете запросик составить...?  [new]
paparome
Member

Откуда: Москва
Сообщений: 4312
Можно так:

-- От начала отпуска до первого отзыва


select v.id_vac, v.fromd, min(vb.fromd)-1 as tod
from #vac v inner join #vac_back vb
on v.id_vac = vb.id_vac
group by v.id_vac, v.fromd
having v.fromd <= min(vb.fromd)-1

union

-- Между отзывами

select vb1.id_vac, vb1.tod+1 as fromd, min(vb2.fromd)-1 as tod
from #vac_back vb1 inner join #vac_back vb2
on (vb1.id_vac = vb2.id_vac) and (vb1.tod < vb2.fromd)
group by vb1.id_vac, vb1.tod
having vb1.tod+1 <= min(vb2.fromd)-1

union

-- От последнего отзыва до конца отпуска

select v.id_vac, max(vb.tod)+1 as fromd, v.tod
from #vac v inner join #vac_back vb
on v.id_vac = vb.id_vac
group by v.id_vac, v.tod
having max(vb.tod)+1 <= v.tod

union

-- Отпуска без отзывов

select v.*
from #vac v left join #vac_back vb
on v.id_vac = vb.id_vac
where vb.id_vac is null
12 апр 04, 15:59    [624224]     Ответить | Цитировать Сообщить модератору
 Re: Не поможете запросик составить...?  [new]
vdv
Member

Откуда:
Сообщений: 145
Спасибо огромное, что помогли
12 апр 04, 16:38    [624341]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить