问题 sql选择计数> 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

此查询返回与该描述匹配的记录,但我需要与该描述匹配的所有记录,还有更多。


5241
2017-11-06 19:56


起源

“所有符合该描述的记录”是什么意思? - Andrew
@Andrew如果给定的参与者有4行符合这些条件,则group by会将其过滤为仅显示参与者一次。他想列出所有四条记录。 - Joel Coehoorn
一世 认为 这就是OP意味着什么,但我宁愿OP澄清。 - Andrew


答案:


您可以使用 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
        );

9
2017-11-06 19:59



这不起作用,我需要参与者有超过1条记录,联系人类型= 1,其中至少有一条记录的iscurrent = 0和isActive = 1 - user1202606
好吧,我想我现在明白了。我已经更新了答案 - GarethD
好,谢谢。这很有效。我必须在case语句中添加Then 1 End,但这样做了。 - user1202606
Woops,漫长的一天。我已经纠正了案件陈述的遗漏。 - GarethD


将其用作子查询并加入其中:

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
2017-11-06 20:01



这是不正确的。如果它在基础上,那么根据定义它是c。 > 1应该没有条件。 - paparazzo
@Blam c table将包含不在base中的ID的记录,因此base对于过滤记录非常有用 c。另外, base 仅包含ID字段。记录 c 包含除ID以外的其他字段,并且给定的ID可能会多次显示 c 有不同的价值观。 - Joel Coehoorn
如果它具有相同的位置,它是如何过滤的? - 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

我会先试试这个


0
2017-11-06 20:07





我想你应该删除:

AND ContactTypeId = 1

这似乎是一个独立的专栏


0
2017-11-06 20:08





  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
2017-11-06 20:12