在SQL表的多行中出现两个不同值的计数次数
我对SQL相当陌生,在一个稍微复杂的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
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')