MYSQL查询:在添加计数时从查询中删除重复项

时间:2015-04-07 17:24:18

标签: mysql

Hello SQL ninja我可以对我正在处理的查询使用一些建议。

我有一张满是Call Detail Records的表格。我想搜索设备的总呼叫数。设备可以是呼叫的发起者或呼叫的目的地。有两列代表,origDeviceNamedestDeviceName

通过Stackoverflow搜索我能够提出一个查询来获取我想要的大部分内容。

问题是因为我正在使用UNION,并且设备既可以是发起者,也可以是目标,我的结果包含重复项。例如

 devices  |  count
 __________________
 PRI      | 32
 SIP      | 17
 PRI      | 24
 SIP      | 10

所需的结果是没有重复的设备列表和每个设备的总计数。例如:

  devices  |  count
 __________________
 PRI      | 56
 SIP      | 27

这是我正在使用的查询:(请注意我只使用NOT LIKE<>过滤掉某种类型的设备)

 SELECT devices, count
   FROM (SELECT origDeviceName as devices
                , COUNT(origDeviceName) AS count
           FROM CDR 
          WHERE origDeviceName NOT LIKE 'SEP%' 
            AND origDeviceName NOT LIKE'CSF%' 
            AND origDeviceName <> ' ' GROUP BY devices
          UNION
         SELECT destDeviceName as devices
                , COUNT(destDeviceName) AS count
           FROM CDR WHERE destDeviceName NOT LIKE 'SEP%' 
            AND destDeviceName NOT LIKE 'CSF%' 
            AND destDeviceName <> ' ' 
          GROUP BY devices) 
    AS All_Devices

我最后也尝试使用GROUP BY,这会过滤掉重复项,但我无法弄清楚如何合并每个设备的计数。

提前致谢。

1 个答案:

答案 0 :(得分:0)

首先,您应该使用union all而不是union。其次,您需要在外层进行聚合:

SELECT d.devices, sum(count)
FROM ((SELECT origDeviceName as devices, COUNT(origDeviceName) AS count
       FROM CDR
       WHERE origDeviceName NOT LIKE 'SEP%' AND
             origDeviceName NOT LIKE'CSF%' AND
             origDeviceName <> ' '
       GROUP BY devices
      ) UNION ALL
      (SELECT  destDeviceName as devices, COUNT(destDeviceName) AS count
       FROM CDR
       WHERE destDeviceName NOT LIKE 'SEP%' AND
             destDeviceName NOT LIKE 'CSF%' AND
             destDeviceName <> ' '
       GROUP BY devices
      )
     ) d
GROUP BY d.devices;