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