计算 SQL 表中 1 个以上行中出现 2 个不同值的次数

mik*_*111 5 sql vb.net sql-server count

我对 SQL 相当陌生,在稍微复杂的 SQL 查询的最后一步中遇到了一些问题。我想计算表中两个不同值出现在超过 1 行中的次数。

我的具体场景是,我的表也存储来自系统的消息/警报。这些警报会发送给需要响应的多个人员。我想计算有多少收件人响应了每个警报。

我已将查询编辑到我所坚持的部分,即:

SELECT DISTINCT AlertID, count(RecipientID) - count(Distinct RecipientID) as Replies, 
FROM [myDB].[dbo].[Alerts]   
Run Code Online (Sandbox Code Playgroud)

此查询显示每个警报中有多少条消息,不包括系统发送给每个收件人的原始消息。问题在于,如果有人对单个警报响应两次,则会将其计为两次响应,而不是 1(这就是我想要的)。

我认为我可以通过计算每个 DISTINCT AlertID 以及 DISTINCT 收件人 ID 与 AlertID 一起出现在超过 1 行中的次数来做到这一点。如果有人回复两次也没关系,因为只要超过一次,就算作一次回复。我很难让它发挥作用。

我的数据如下所示:

RecipientID  MsgContents        SentBy       AlertID
12345        Msg1               mySystem     11111
98765        Msg1               MySystem     11111
12345        1st Reply to Msg1  John Doe     11111
12345        2nd Reply to Msg1  John Doe     11111
98765        reply to Msg1      Mike Smith   11111
12345        Msg3               mySystem     33333
12345        Reply to Msg3      John Doe     33333  
12345        Msg2               mySystem     99999
Run Code Online (Sandbox Code Playgroud)

我希望查询的输出为:

 AlertID        Replies
 11111          2
 33333          1
 99999          0   
Run Code Online (Sandbox Code Playgroud)

我认为这个答案会有帮助,但无法让它为我工作。如果可能的话,我还想将其保留在一个查询中,因为系统将处理大量数据。如果这不是最简单的方法,我愿意接受所有建议。

任何帮助将不胜感激。

Fel*_*tan 3

您可以使用CASE内的表达式来完成此操作COUNT

SELECT
    AlertID,
    Replies = COUNT(DISTINCT CASE WHEN SentBy <> 'mySystem' THEN RecepientID END)
FROM alerts
GROUP BY AlertID
Run Code Online (Sandbox Code Playgroud)

ONLINE DEMO