为什么我不能对包含聚合的表达式执行聚合函数,但是我可以通过在它周围创建一个新的select语句来实现?

Mic*_*l A 27 sql t-sql sql-server sql-server-2005 sql-server-2008

为什么在SQL Server中我不能这样做:

select  sum(count(id)) as 'count'
from    table
Run Code Online (Sandbox Code Playgroud)

但我能做到

select sum(x.count)
from
(
    select  count(id) as 'count'
    from    table   
) x
Run Code Online (Sandbox Code Playgroud)

它们本质上不是一回事吗?为了理解为什么不允许第一块代码,为什么我要考虑这个?

nvo*_*gel 14

您的示例中的SUM()是无操作 - COUNT()的SUM()意味着与COUNT()相同.因此,您的示例查询似乎都没有做任何有用的事情.

在我看来,嵌套聚合只有在你想要应用两个不同的聚合时才有意义 - 这意味着GROUP BY在不同的列集上.要指定两个不同的聚合,您需要使用GROUPING SETS功能或SUM()OVER功能.也许如果你解释你想要实现的目标,有人可以告诉你如何.

  • 我更好奇为什么我必须使用派生表来实现这一点 - 为什么SQL Server不支持我的第一个例子,但它确实是我的第二个?它们对我来说似乎基本相同.没有真正的目的,要求教育. (2认同)
  • @Michael,因为在单个SELECT语句中没有办法为嵌套函数指定不同的聚合,如果两个函数都使用相同的聚合就没有意义.这回答了这个问题吗? (2认同)

Rem*_*anu 8

问题的要点是没有应用于关系的聚合聚合这样的概念,请参阅聚合.有这样一个概念会在定义中留下太多漏洞并使GROUP BY子句无法表达:它还需要定义内部聚合GROUP BY子句外部聚合!这也适用于其他聚合属性,如HAVING子句.

但是,应用于关系的聚合结果是另一种关系,而这种结果关系又可以支持新的聚合运算符.这解释了为什么您可以将结果聚合到外部SELECT中.这在定义中没有任何歧义,每个SELECT都有自己独特的GROUP BY/HAVING子句.