sql union sum针对不同的描述字段
Posted
技术标签:
【中文标题】sql union sum针对不同的描述字段【英文标题】:sql union sum against a distinct description field 【发布时间】:2015-10-15 12:20:28 【问题描述】:我有以下 SQL:
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 子句中
无论如何?
【问题讨论】:
你也需要一个***的 GROUP BY。 在查询中同时具有 DISTINCT 和 聚合(GROUP BY、SUM)是非常非常罕见的事情。你到底想达到什么目的?为什么 GROUP BY 还不够?为什么您认为必须对聚合结果使用 DISTINCT? 你到底想在这里数什么? 看起来您只是在计算一个类别的 prcIncidentManagement 和 prcRequestFulfilment 中有多少记录。是这样还是背后有更多? 【参考方案1】:删除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
将为您提供具有聚合函数的不同列来聚合每个组的其他列,因此您不需要。
【讨论】:
【参考方案2】:如果我假设eFolderName
永远不是NULL
并且eFolderId
具有正确的外键关系(这都是非常合理的假设),那么您可以通过删除子查询中的基础连接来简化查询:
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;
【讨论】:
以上是关于sql union sum针对不同的描述字段的主要内容,如果未能解决你的问题,请参考以下文章
SQL UNION 的用法中前后两个查询语句所含字段是不是一定要相同?