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

Откуда: Киев
Сообщений: 45
Есть две таблицы:
Table1(Id, DateBeg, DateEnd) - периоды работы 1-й части прибора
Table2(Id, DateBeg, DateEnd) - периоды работы 2-й части прибора
у обеих таблиц первичный ключ Id+DateBeg
DateEnd может быть NULL (если эта часть прибора работает до сих пор)
Прибор (Id) считается работающим, если работают обе части одновременно.

Задача:
Построить запрос, возвращающий периоды работы прибора в виде
(Id, DateBeg, DateEnd)

Какие будут идеи?
15 май 03, 14:26    [199767]     Ответить | Цитировать Сообщить модератору
 Re: Задачка  [new]
ss
Guest
SELECT a.id,

CASE WHEN a.DateBeg>b.DateBeg THEN a.DateBeg ELSE b.DateBeg END as DateBeg,
CASE WHEN a.DateEnd>b.DateEnd THEN b.DateEnd ELSE a.DateEnd END as DateEnd
FROM table1 as a INNER JOIN Table2 as b ON a.id=b.id
WHERE a.DateBeg<b.Date.End AND b.DateBeg>a.DateEnd
15 май 03, 14:33    [199783]     Ответить | Цитировать Сообщить модератору
 Re: Задачка  [new]
ss
Guest
SELECT a.id,

CASE WHEN a.DateBeg>b.DateBeg THEN a.DateBeg ELSE b.DateBeg END as DateBeg,
CASE WHEN a.DateEnd>b.DateEnd THEN b.DateEnd ELSE a.DateEnd END as DateEnd
FROM table1 as a INNER JOIN Table2 as b ON a.id=b.id
WHERE a.DateBeg<b.Date.End AND b.DateBeg<a.DateEnd


описался...
15 май 03, 14:35    [199788]     Ответить | Цитировать Сообщить модератору
 Re: Задачка  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
ss, второй раз описался
15 май 03, 14:40    [199800]     Ответить | Цитировать Сообщить модератору
 Re: Задачка  [new]
chexum
Member

Откуда: Киев
Сообщений: 45
не работает

пример:
INSERT INTO Table1 VALUES(1, '20030101', '20030110')

INSERT INTO Table1 VALUES(1, '20030120', NULL)
INSERT INTO Table2 VALUES(1, '20030105', '20030115')
INSERT INTO Table2 VALUES(1, '20030125', '20030130')

SELECT ...

Должно вернуть
1  2003-01-05  2003-01-10 

1 2003-01-25 2003-01-30

А вернуло только первую строчку:
1  2003-01-05  2003-01-10
15 май 03, 15:08    [199867]     Ответить | Цитировать Сообщить модератору
 Re: Задачка  [new]
chexum
Member

Откуда: Киев
Сообщений: 45
Вот так, работает:
SELECT a.id,

CASE WHEN a.DateBeg>b.DateBeg THEN a.DateBeg ELSE b.DateBeg END as DateBeg,
CASE WHEN ISNULL(a.DateEnd, '29990101')>ISNULL(b.DateEnd, '29990101') THEN b.DateEnd ELSE a.DateEnd END as DateEnd
FROM table1 as a INNER JOIN Table2 as b ON a.id=b.id
WHERE a.DateBeg<ISNULL(b.DateEnd, '29990101') AND b.DateBeg<ISNULL(a.DateEnd, '29990101')

Но, как-то громоздко. Может есть решение по-красивее?
15 май 03, 15:16    [199886]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить