web-dev-qa-db-fra.com

sql select records avec count> 1 où au moins un enregistrement a une valeur

J'essaie d'obtenir tous les participants qui ont plus d'un enregistrement dans la table où au moins un de ces enregistrements a IsCurrent = 0 et IsActive = 1

C'est ce que j'ai jusqu'à présent, mais ça ne fonctionne pas:

    SELECT  ParticipantId 
    FROM Contact
    WHERE (IsCurrent = 0 AND IsActive = 1 AND ContactTypeId = 1)
    Group by ParticipantId
    Having COUNT(ParticipantId) > 1

Cette requête ramène un enregistrement qui correspond à cette description, mais j'ai besoin de tous les enregistrements qui correspondent à cette description, il y en a plus.

11
user1202606

Vous pouvez utiliser EXISTE :

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
        );
9
GarethD

Utilisez-le comme une sous-requête et rejoignez-le:

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
Joel Coehoorn
  SELECT  ParticipantId 
    FROM Contact
   Group by ParticipantId 
  Having Count(*) > 1 
Intersect
  SELECT  ParticipantId 
    FROM Contact
   WHERE IsCurrent = 0 
     AND IsActive = 1 
     AND ContactTypeId = 1
0
paparazzo
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

Je voudrais d'abord essayer ceci

0
automatic

Je pense que vous devriez juste enlever:

AND ContactTypeId = 1

qui semble être une colonne indexée

0
Sergio