【问题标题】:Count number of times 2 distinct values appear in more than 1 row in SQL Table统计 SQL 表中超过 1 行中出现 2 个不同值的次数
【发布时间】:2016-05-17 02:35:06
【问题描述】:

我对 SQL 相当陌生,并且在稍微复杂的 SQL 查询中的最后一步遇到了一些麻烦。我想计算表中有多少次,两个不同的值出现在超过 1 行中。

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

我已将查询编辑到我卡住的部分,即:

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 会有所帮助,但无法让它为我工作。如果可能,我还想将其保留在一个查询中,因为系统将处理大量数据。如果这不是最简单的方法,我愿意接受所有建议。

任何帮助将不胜感激。

【问题讨论】:

  • 您可能应该提到“mySystem”发送的记录不应该计算在内。

标签: sql sql-server vb.net count


【解决方案1】:

您可以在COUNT 中使用CASE 表达式来做到这一点。

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

ONLINE DEMO

【讨论】:

    【解决方案2】:

    首先,当你应该使用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;
    

    【讨论】:

      【解决方案3】:
      select AlertId, count(RecipientId) as Replies group by AlertId 
      from (select * from Alerts where SentBy <> 'mySystem') 
      

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

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

      【讨论】:

        猜你喜欢
        • 2021-04-17
        • 1970-01-01
        • 1970-01-01
        • 2014-10-16
        • 2016-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多