计算SQL中多个字段中重复项的出现次数

计算SQL中多个字段中重复项的出现次数,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,我有一个包含通话记录的表,如下所示: RouterCallKey | SequenceNumber | PeripheralCallKey | AgentID | CallDisposition 100 1 500 1 Handled 101 1 501 2 Handled 102

我有一个包含通话记录的表,如下所示:

RouterCallKey | SequenceNumber | PeripheralCallKey | AgentID | CallDisposition  
100             1                500                 1         Handled
101             1                501                 2         Handled
102             1                502                 3         Transfer
102             2                502                 4         Handled
103             1                503                 1         Transfer
103             2                504                 2         Handled
我正试图报告生产问题的发生。对于这些调用中的每一个,RouterCallKey都是相同的(同一调用的不同分支),序列号是不同的,PeripheralCallKey是相同的,CallDisposition将在第一个分支传输,并在第二个分支处理。像这样:

RouterCallKey | SequenceNumber | PeripheralCallKey | AgentID | CallDisposition  
102             1                502                 3         Transfer
102             2                502                 4         Handled
代理3执行了错误的传输,因此我们看到如下数据。不符合这些条件的呼叫不会出现问题(例如,RouterCallKey 103可以,不需要计数)

我首先查询该表,查找调用配置为Transfer的RouterCallKey列表。然后,我使用该列表获取第一个列表中包含RouterCallKey的所有呼叫分支的另一个列表。示例查询,伪代码:

Select * from CallDetail
where DateTime between '07/15/2014 00:00:01' and '07/15/2014 23:59:59'
and RouterCallKey in
(select RouterCallKey from CallDetail
where DateTime between '07/15/2014 00:00:01' and '07/15/2014 23:59:59'
and AgentPeripheralNumber is not null
and CallDisposition = 'Transfer'
and RouterCallKey <> '0')
非常感谢您的帮助。我肯定我忽略了一个简单的方法。我不是一个真正的SQL专家,但我的任务是解决这个问题。虽然我在这里找到了很多很好的解决方案,但我对SO也是新手,所以如果我做错了,请让我知道:)


编辑:我应该补充一点,RouterCallKey在一天内是唯一的,但是PeripheralCallKey可以在同一时间内重复使用好几次。“102”和“502”只是一些例子,实际的按键差别很大。因此,基本上,对于CallDisposition为“Transfer”的呼叫的每个RouterCallKey,查看具有相同RouterCallKey的所有呼叫,并且对于每个呼叫,外围设备CallKey是否匹配?如果他们这样做,则增加发起转移的代理的计数(BADCALLES)。

除非我严重误解了这个问题,否则这可能会让你接近你想要的;请原谅任何语法上的怪癖,因为我现在主要是在编写DB2:

SELECT T.AgentID, count(*) as BadCalls
FROM CallRecords as T
INNER JOIN CallRecords as H
ON
  T.RouterCallKey = H.RouterCallKey
  AND T.PeripheralCallKey = H.PeripheralCallKey
  AND H.SequenceNumber > T.SequenceNumber
WHERE
  T.CallDisposition = 'Transfer'
  AND H.CallDisposition = 'Handled'
  AND T.SequenceNumber = 1
  AND T.AgentID <> H.AgentID
GROUP BY
  T.AgentID
选择T.AgentID,将(*)计数为坏调用
从CallRecords作为T
内部连接调用记录为H
在…上
T.RouterCallKey=H.RouterCallKey
T.peripheraldcallkey=H.peripheraldcallkey
和H.SequenceNumber>T.SequenceNumber
哪里
T.CallDisposition='Transfer'
H.CallDisposition='Handled'
和T.SequenceNumber=1
和T.AgentID H.AgentID
分组
阿根蒂德

请用您正在使用的数据库标记您的问题。发布您到目前为止的查询,或设置SQL FIDLE。乍一看效果不错,我明天会尝试并报告。谢谢你的快速回复!你的回答(针对我的具体情况做了一些调整)让我在24小时内不到6次调用Excel数据。在成千上万的电话中,大约1600个关于这个问题的电话中,我会说这已经足够接近了!非常感谢你的帮助!
SELECT T.AgentID, count(*) as BadCalls
FROM CallRecords as T
INNER JOIN CallRecords as H
ON
  T.RouterCallKey = H.RouterCallKey
  AND T.PeripheralCallKey = H.PeripheralCallKey
  AND H.SequenceNumber > T.SequenceNumber
WHERE
  T.CallDisposition = 'Transfer'
  AND H.CallDisposition = 'Handled'
  AND T.SequenceNumber = 1
  AND T.AgentID <> H.AgentID
GROUP BY
  T.AgentID