Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL表的多行中出现两个不同值的计数次数_Sql_Sql Server_Vb.net_Count - Fatal编程技术网

在SQL表的多行中出现两个不同值的计数次数

在SQL表的多行中出现两个不同值的计数次数,sql,sql-server,vb.net,count,Sql,Sql Server,Vb.net,Count,我对SQL相当陌生,在一个稍微复杂的SQL查询的最后一步中遇到了一些问题。我想计算在表中,两个不同的值出现在多行中的次数 我的特定场景是,我的表也存储来自系统的消息/警报。这些警报将发送给需要响应的多个人员。我想计算有多少收件人响应了每个警报 我已将我的查询向下编辑到我卡住的部分,如下所示: SELECT DISTINCT AlertID, count(RecipientID) - count(Distinct RecipientID) as Replies, FROM [myDB].[dbo

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

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

我已将我的查询向下编辑到我卡住的部分,如下所示:

SELECT DISTINCT AlertID, count(RecipientID) - count(Distinct RecipientID) as Replies, 
FROM [myDB].[dbo].[Alerts]   
此查询显示每个警报中包含的邮件数量,不包括从系统发送给每个收件人的原始邮件。问题在于,如果有人对一个警报做出两次响应,则该警报将被视为两次响应,与我想要的1对应

我想我可以通过计算每个不同的AlertID,以及不同的收件人ID与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   
我原以为这会有帮助,但没能让它对我起作用。如果可能的话,我还希望将其保存在一个查询中,因为系统将处理大量数据。如果这不是最简单的方法,我愿意接受所有建议

任何帮助都将不胜感激

首先,当您应该使用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;
您可以在COUNT中使用大小写表达式来实现这一点

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


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

您可能应该提到,由“mySystem”发送的记录不应计算在内。
SELECT
    AlertID,
    Replies = COUNT(DISTINCT CASE WHEN SentBy <> 'mySystem' THEN RecepientID END)
FROM alerts
GROUP BY AlertID
select AlertId, count(RecipientId) as Replies group by AlertId 
from (select * from Alerts where SentBy <> 'mySystem')