Sql select records with count> 1, где в лизинге одна запись имеет значение
Я пытаюсь заставить всех участников, у которых более 1 записи в таблице, где в аренде одна из этих записей имеет IsCurrent = 0 и IsActive = 1
Это то, что у меня есть до сих пор, но оно не работает:
SELECT ParticipantId
FROM Contact
WHERE (IsCurrent = 0 AND IsActive = 1 AND ContactTypeId = 1)
Group by ParticipantId
Having COUNT(ParticipantId) > 1
Этот запрос возвращает запись, которая соответствует этому описанию, но мне нужны все записи, соответствующие этому описанию, больше.
Ответы
Ответ 1
Вы можете использовать EXISTS:
SELECT ParticipantId
FROM Contact
WHERE EXISTS
( SELECT 1
FROM Contact c2
WHERE c2.ParticipantID = c.ParticipantId
AND ContactTypeId = 1
GROUP BY ParticipantID
HAVING COUNT(*) > 1
AND COUNT(CASE WHEN IsCurrent = 0 AND IsActive = 1 THEN 1 END) >= 1
);
Ответ 2
Используйте его как подзапрос и присоедините к нему:
select * from
(
SELECT ParticipantId
FROM Contact
WHERE (IsCurrent = 0 AND IsActive = 1 AND ContactTypeId = 1)
Group by ParticipantId
Having COUNT(ParticipantId) > 1
) base
inner join Contact c on c.ParticipantId = base.ParticipantID
WHERE (IsCurrent = 0 AND IsActive = 1 AND ContactTypeId = 1)
Ответ 3
select
ParticipantId
from Contact as c
group by
ParticipantId
having
Count(*) > 1
and
Sum(Case when IsCurrent = 0 then 1 else 0 end) >= 1
and
Sum(Case when IsActive = 1 then 1 else 0 end) >= 1
Сначала я попробую это
Ответ 4
Я думаю, вам нужно просто удалить:
AND ContactTypeId = 1
который, как представляется, представляет собой идексированный столбец
Ответ 5
SELECT ParticipantId
FROM Contact
Group by ParticipantId
Having Count(*) > 1
Intersect
SELECT ParticipantId
FROM Contact
WHERE IsCurrent = 0
AND IsActive = 1
AND ContactTypeId = 1