【问题标题】:sql union sum against a distinct description fieldsql union sum针对不同的描述字段
【发布时间】: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 中有多少记录。是这样还是背后有更多?

标签: sql sql-server


【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 2016-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 2013-02-04
      • 1970-01-01
      • 2013-11-08
      • 1970-01-01
      相关资源
      最近更新 更多