计算SQL表

时间:2016-05-17 02:35:07

标签: sql sql-server vb.net count

我是SQL的新手,在稍微复杂的SQL查询的最后一步遇到了一些麻烦。我想计算表中多少次,两个不同的值出现在多行中。

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

我已将我的查询编辑到我坚持的部分,这就是:

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

此查询显示每个警报中包含的消息数,不包括系统中每个收件人的原始消息。这个问题是,如果某人对单个警报做出两次响应,则会将其视为两个响应为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

我希望查询的输出为:

 AlertID        Replies
 11111          2
 33333          1
 99999          0   

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

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:3)

您可以使用CASE内的COUNT表达式执行此操作。

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

ONLINE DEMO

答案 1 :(得分:1)

首先,当您使用select distinct时,请不要使用group by

然后这会产生您想要的结果:

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;

答案 2 :(得分:0)

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

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

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