Hello SQL ninja我可以对我正在处理的查询使用一些建议。
我有一张满是Call Detail Records的表格。我想搜索设备的总呼叫数。设备可以是呼叫的发起者或呼叫的目的地。有两列代表,origDeviceName
和destDeviceName
。
通过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
,这会过滤掉重复项,但我无法弄清楚如何合并每个设备的计数。
提前致谢。
答案 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;