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 的用法中前后两个查询语句所含字段是不是一定要相同?

将表名的“字段”添加到来自 UNION 的 SQL 结果?

sql查询一个字段不同值并返回

Mybatis union查询异常

Excel VBA SQL UNION SUM 对具有不同列名的表进行 GROUP BY

UNION 到特定字段