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

Откуда: Krasnoyarsk
Сообщений: 433
Есть таблица клиентов (ID, Name) и таблица договоров (ID,ClientID,DateStart,DateEnd)
У некоторых клиентов ВООБЩЕ НЕТ договоров, у других клиентов несколько договоров, у части клиентов все договора закрыты, т.е во всех их договорах поле DateEnd не NULL.
Нужно выбрать селектом только тех клиентиов у кого все договора закрыты.
19 июн 09, 13:09    [7320281]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить выборку  [new]
Megabyte
Member

Откуда: ближайшее заМКАДье
Сообщений: 4892
AlexanderVS
Есть таблица клиентов (ID, Name) и таблица договоров (ID,ClientID,DateStart,DateEnd)
У некоторых клиентов ВООБЩЕ НЕТ договоров, у других клиентов несколько договоров, у части клиентов все договора закрыты, т.е во всех их договорах поле DateEnd не NULL.
Нужно выбрать селектом только тех клиентиов у кого все договора закрыты.


SELECT
 С.*
FROM Clients C
WHERE C.Id Exists (
  SELECT ID
  FROM Contracts
  WHERE ClientID  = C.ID
)
C.Id not Exists (
  SELECT ID
  FROM Contracts
  WHERE ClientID  = C.ID AND DateEnd IS NOT NULL
)
Если я правильно понял, только те клиенты, у которых есть договора, но они закрыты?!
19 июн 09, 13:38    [7320468]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить выборку  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2549
?
DECLARE @clients TABLE (ID int IDENTITY(1, 1), Name varchar(128)) 
DECLARE @contracts TABLE (ID int IDENTITY(1, 1), ClientID int, DateStart datetime, DateEnd datetime)

INSERT @clients (Name) SELECT 'Вася'
INSERT @clients (Name) SELECT 'Петя'
INSERT @clients (Name) SELECT 'Саша'

INSERT @contracts (ClientID, DateStart, DateEnd) SELECT 1, '20080101', NULL
INSERT @contracts (ClientID, DateStart, DateEnd) SELECT 1, '20080101', '20090101'
INSERT @contracts (ClientID, DateStart, DateEnd) SELECT 1, '20091101', NULL
INSERT @contracts (ClientID, DateStart, DateEnd) SELECT 3, '20081201', '20090101'
INSERT @contracts (ClientID, DateStart, DateEnd) SELECT 3, '20090311', '20091111'
INSERT @contracts (ClientID, DateStart, DateEnd) SELECT 2, '20080101', NULL

SELECT t1.*
FROM @clients t1
WHERE NOT EXISTS
(SELECT TOP 1 1 FROM @contracts t2 WHERE t2.ClientID = t1.ID AND t2.DateEnd IS NULL ORDER BY t2.ID)
19 июн 09, 13:39    [7320470]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить выборку  [new]
Megabyte
Member

Откуда: ближайшее заМКАДье
Сообщений: 4892
Тьфу, накосячил, все проще
SELECT
 С.*
FROM Clients C
C.Id Exists (
  SELECT ID
  FROM Contracts
  WHERE ClientID  = C.ID AND DateEnd IS NOT NULL
)
19 июн 09, 13:40    [7320476]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить выборку  [new]
PaulYoung
Member

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

у кого ВСЕ договора закрыты
19 июн 09, 13:41    [7320484]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить выборку  [new]
iljy
Guest
PaulYoung,
select * from Clients
except
select * from Clients cl
where exist (select * from Contracts c where c.ClientId = c.Id and DateEnd Is NULL) or
    not exist(select * from Contracts c where c.ClientId = c.Id) 
в первом приближении как-то так...
19 июн 09, 13:45    [7320511]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить выборку  [new]
_djХомяГ
Guest
2 PaulYoung - у вас не правильно , т к
если например закомментировать это
-----INSERT @contracts (ClientID, DateStart, DateEnd) SELECT 2, '20080101', NULL

то Петя (2) будет присутствовать в конечном результате

можно и так
select distinct  c.Id,Name 
from #Clients c join #Orders o
on c.ID=o.ClientId
where DateEnd is not null 
and not exists (select 1 from #Orders o1 where c.ID=o1.ClientId and DAteEnd is null)
19 июн 09, 13:50    [7320555]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить выборку  [new]
buven
Member

Откуда:
Сообщений: 792
Select c.name from contracts t inner join clients c on t.clientid=c.id group by c.name having count(t.id)=count(t.dateEnd)


З.Ы. не проверял, но помему в эту сторону глядеть нуна.


Проводить жизнь в ожидании мессии, который придёт и спасёт мир, всё-равно, что ждать палку в тетрисе.
Даже если и появится, то ты к тому времени наберёшь такую гору дерьма, что те будет уже абсолютно пох... :)
19 июн 09, 14:00    [7320636]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить выборку  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2549
_djХомяГ
2 PaulYoung - у вас не правильно , т к
если например закомментировать это
-----INSERT @contracts (ClientID, DateStart, DateEnd) SELECT 2, '20080101', NULL

то Петя (2) будет присутствовать в конечном результате

можно и так
select distinct  c.Id,Name 
from #Clients c join #Orders o
on c.ID=o.ClientId
where DateEnd is not null 
and not exists (select 1 from #Orders o1 where c.ID=o1.ClientId and DAteEnd is null)
Ваша правда... :(
19 июн 09, 15:04    [7321181]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить выборку  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2549
PaulYoung
_djХомяГ
2 PaulYoung - у вас не правильно , т к
если например закомментировать это
-----INSERT @contracts (ClientID, DateStart, DateEnd) SELECT 2, '20080101', NULL

то Петя (2) будет присутствовать в конечном результате

можно и так
select distinct  c.Id,Name 
from #Clients c join #Orders o
on c.ID=o.ClientId
where DateEnd is not null 
and not exists (select 1 from #Orders o1 where c.ID=o1.ClientId and DAteEnd is null)
Ваша правда... :(
добавим
AND 
EXISTS
(
SELECT 1 FROM @contracts t2
WHERE t2.ClientID = t1.ID
)
19 июн 09, 15:11    [7321239]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить выборку  [new]
risp
Member

Откуда:
Сообщений: 35
SELECT ID, name FROM Clients AS C
INNER JOIN Docs AS D ON D.clientid = C.id AND DateEnd IS NOT NULL
19 июн 09, 15:23    [7321318]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить выборку  [new]
risp
Member

Откуда:
Сообщений: 35
Пардон, сразу не въехал во ВСЕ договора


SELECT ID, name FROM Clients AS C
INNER JOIN Docs AS D ON D.clientid = C.id AND DateEnd IS NOT NULL

WHERE NOT EXISTS (SELECT * FROM Docs WHERE DateEnd IS NOT NULL AND clientid = c.id)
19 июн 09, 15:27    [7321340]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить