2015-11-05 4 views
1

У меня есть таблица, как это в SQL Server:Выберите все записи для лиц, которые всегда выполняют заданный критерий

Name ID StartDate EndDate 
-------------------------------- 
James 232 2005  2015 
James 232 2001  2006 
Joe  600 1982  2005 
Lord 608 2003  2005 
Lord 608 2006  2012 
Lord 608 1999  2004 
Lee  122 2001  2003 
Lee  122 2002  2006 

Мне нужно написать запрос, который включает в себя только записи для имя/ID, если все их записи отвечают следующему критерию: StartDate не после 2005 и EndDate не может быть до 2005 года

результаты запроса должны поэтому быть как ниже:

Name ID StartDate EndDate 
------------------------------- 
James 232 2005  2015 
James 232 2001  2006 
Joe  600 1982  2005 

Ниже мой запрос, который неправильно возвращает три записи для Господа и Ли:

SELECT * 
FROM #FortuneCompany fc 
WHERE EXISTS (
       SELECT 1 
       FROM #FortuneCompany fc1 
       WHERE fc1.ID = fc.ID 
       AND YEAR(fc1.StartDate)<=2005 
       AND YEAR(fc1.EndDate)>=2005 
      ) 
+1

Где ваш запрос? –

+0

Какой SQL вы уже пробовали? – MiguelH

+0

'где startdate <= 2005 и enddate> = 2005'. –

ответ

0

A WHERE положение?

SELECT Name, ID, StartDate, EndDate 
FROM MyTable 
WHERE StartDate <= '2005-01-01' AND Enddate >= '2005-01-01' 
+0

Я предполагаю, что OP хочет WHERE StartDate <= '2005-12-31' AND Enddate> = '2005-01-01', чтобы включить целые годы. (Просто гадать ...) – jarlh

+0

К сожалению, я пропустил «** равный ** или больше 2005 года». Я исправил. –

0
SELECT Name, ID, StartDate, EndDate 
FROM Table 
WHERE StartDate <= 2005 
AND Enddate >= 2005 

Нет необходимости подзапроса. Я полагаю, что столбцы StartDate и EndDate являются int. Только если они датированы, вам нужно использовать функцию YEAR(). В вашем вопросе верхняя и нижняя строка из трех результатов, которые вы сказали, не должны быть возвращены, действительно соответствуют критериям.

+0

этот вопрос не дает правильного ответа, ясно прочитайте мой вопрос – Selva

+0

@ Арасу - ну, вот в чем проблема. Ваш вопрос * не * ясный. Почему бы вам не поработать над этим первым. –

+0

Это должно быть '> =' вместо '=>' –

0

Если вы правильно поняли, что вы не хотите выбирать строки для пользователя вообще, если для этого пользователя имеется не менее 1 неверная запись. Для достижения этой цели вы можете использовать NOT IN в следующем:

QUERY

SELECT Name, ID, StartDate, EndDate 
FROM #FortuneCompany fc 
WHERE Name NOT IN(
     SELECT Name 
     FROM #FortuneCompany fc 
     WHERE StartDate > 2005 
     OR Enddate < 2005) 

Выборочные данные

CREATE TABLE #FortuneCompany 
(
    Name NVARCHAR(40), 
    ID INT, 
    StartDate INT, 
    EndDate INT 
) 
INSERT INTO #FortuneCompany VALUES 
('James',232, 2005, 2015), 
('James',232, 2001, 2006), 
('Joe' ,600, 1982, 2005), 
('Lord' ,608, 2003, 2005), 
('Lord' ,608, 2006, 2012), 
('Lord' ,608, 1999, 2004), 
('Lee' ,122, 2001, 2003), 
('Lee' ,122, 2002, 2006) 

OUTPUT

Name ID StartDate EndDate 
James 232 2005  2015 
James 232 2001  2006 
Joe  600 1982  2005 
+0

Мне не нужен результат, который полностью заполняет это условие, у меня есть результат, который полностью заполняет это условие только – Selva

+0

@Arasu проверяет обновленный ответ. –

+0

это включает имя lee и lord, но я не хочу этих имен, потому что lee имеет startdate 2001 и 2003, который является моим условием enddate равен или greate, чем 2005, не заполнен, а затем называет лорда также – Selva

Смежные вопросы