2015-10-15 83 views
1

我有以下SQL:SQL UNION总和

select distinct cat, sum(cnt) 
from 
(
select distinct prcIncidentManagement.CallCategory cat, count(eFolder.eFolderName) cnt 
from prcIncidentManagement 
inner join eFolder 
on prcIncidentManagement.EFOLDERID=eFolder.eFolderID 
group by prcIncidentManagement.CallCategory 

union all 

select distinct prcRequestFulfilment.CallCategory cat, count(eFolder.eFolderName) cnt 
from prcRequestFulfilment 
inner join eFolder 
on prcRequestFulfilment.EFOLDERID=eFolder.eFolderID 
group by prcRequestFulfilment.CallCategory 
) results 
order by 1 

我发现很难总结总的和组它靠在呼叫类别作为错误信息如下:

列“results.cat”在选择列表中无效,因为包含在聚合函数或GROUP BY子句是不

反正这个呢?

+0

你也需要一个顶级的GROUP BY。 – jarlh

+1

在查询中同时拥有DISTINCT *和* aggregation(GROUP BY,SUM)是非常非常罕见的事情。你究竟想达到什么目的?为什么GROUP BY不够?为什么你认为你必须对聚合结果使用DISTINCT? –

+0

你究竟想在这里算什么?它*看起来像你只是在计算一个类别的prcIncidentManagement和prcRequestFulfilment中有多少条记录。是它还是它背后更多? –

回答

2

删除distinct并在外部查询中添加GROUP BY

select cat, sum(cnt) 
from 
(
    select prcIncidentManagement.CallCategory cat, count(eFolder.eFolderName) cnt 
    from prcIncidentManagement 
    inner join eFolder 
    on prcIncidentManagement.EFOLDERID=eFolder.eFolderID 
    group by prcIncidentManagement.CallCategory 
    union all 
    select prcRequestFulfilment.CallCategory cat, count(eFolder.eFolderName) cnt 
    from prcRequestFulfilment 
    inner join eFolder 
    on prcRequestFulfilment.EFOLDERID=eFolder.eFolderID 
    group by prcRequestFulfilment.CallCategory 
) results 
GROUP BY cat 
order by 1; 

当您添加和聚合功能,您可以选择额外的列是不是group by子句,也不在聚合函数。

也不需要DISTINCT在子查询中具有聚合函数,因为它没用,因为group by将为您提供具有聚合函数的不同列,以聚合每个组的其他列,因此您不需要需要它。

0

如果我认为eFolderName从未NULLeFolderId有适当的外键关系(这两者都是非常合理的假设),那么你可以通过删除子查询的基本连接简化查询:

select cat, sum(cnt) 
from ((select im.CallCategory as cat, count(im.eFolderID) as cnt 
     from prcIncidentManagement im 
     group by im.CallCategory 
    ) union all 
     (select f.CallCategory as cat, count(im.eFolderID) as cnt 
     from prcRequestFulfilment f 
     group by f.CallCategory 
    ) 
    ) results 
group by cat 
order by cat;