我是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会有所帮助,但无法让它为我工作。如果可能的话,我也希望将其保留在一个查询中,因为系统将处理大量数据。如果这不是最简单的方法,我愿意接受所有建议。
非常感谢任何帮助。
答案 0 :(得分:3)
您可以使用CASE
内的COUNT
表达式执行此操作。
SELECT
AlertID,
Replies = COUNT(DISTINCT CASE WHEN SentBy <> 'mySystem' THEN RecepientID END)
FROM alerts
GROUP BY AlertID
答案 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')
- 第一行获取每个警报的记录
- 第二行获取实际收件人的记录而不是系统记录