在SQL表中计算出现两个不同值的次数超过1行的数量

5

我对 SQL 还比较陌生,最近在一个稍微复杂的 SQL 查询的最后一步遇到了些麻烦。我想要计算表格中,有多少种不同的数值出现在超过1行数据中。

具体情况是,我的表格还存储了来自系统的消息/警报信息。这些警报会发送给多个需要做出响应的人员。我想要计算每个警报收件人的回复次数。

我已经将查询内容编辑下来,卡在的部分就是这个:

SELECT DISTINCT AlertID, count(RecipientID) - count(Distinct RecipientID) as Replies, 
FROM [myDB].[dbo].[Alerts]   

这个查询展示了每个警报中有多少条信息,不包括系统发送给每个收件人的原始信息。问题在于,如果某人对单个警报回复两次,则会被计算为两个响应,而不是我想要的1个。
我认为我可以通过计算每个DISTINCT AlertID以及DISTINCT recipients ID在超过1行中与AlertID一起出现的次数来实现这一点。如果有人回复两次,那么也没关系,因为只要有一个以上,就会被计算为单个响应。我在让它工作方面遇到了困难。
我的数据看起来像这样:
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

我希望查询结果为:

以下是需要翻译的内容:

 AlertID        Replies
 11111          2
 33333          1
 99999          0   

我认为这个答案会有帮助,但我无法让其对我发挥作用。如果可能的话,我也希望将其保留在一个查询中,因为该系统将处理大量数据。如果这不是最简单的方法,我也愿意接受所有建议。
任何帮助都将不胜感激。

你应该明确提到,由'mySystem'发送的记录不应计入。 - Ash
3个回答

3
你可以在COUNT内部使用CASE表达式来实现这一点。
SELECT
    AlertID,
    Replies = COUNT(DISTINCT CASE WHEN SentBy <> 'mySystem' THEN RecepientID END)
FROM alerts
GROUP BY AlertID

ONLINE DEMO


1
首先,当你应该使用group by时,请不要使用select distinct
然后,这将产生你想要的结果:
SELECT AlertID, (count(Distinct RecipientID) - 1) as Replies
FROM [myDB].[dbo].[Alerts]   
GROUP BY AlertId;

您可能实际上想要的是:

SELECT AlertID, count(Distinct case when sentBy <> 'mySystem' then RecipientID) as Replies 
FROM [myDB].[dbo].[Alerts]   
GROUP BY AlertId;

0
select AlertId, count(RecipientId) as Replies group by AlertId 
from (select * from Alerts where SentBy <> 'mySystem') 

--第一行获取每个警报的记录

--第二行获取实际收件人的记录,而不是系统记录


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接