繁体   English   中英

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

[英]Why can't I perform an aggregate function on an expression containing an aggregate but I can do so by creating a new select statement around it?

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

select  sum(count(id)) as 'count'
from    table

但我能做到

select sum(x.count)
from
(
    select  count(id) as 'count'
    from    table   
) x

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

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

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

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

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

它使用SQLFiddle为我工作,不知道为什么它不适合你。 但我确实有一个解释,为什么它可能不适合你,为什么替代方案可行...

您的示例使用关键字作为列名,但可能并不总是有效。 但是当列只在子表达式中时,查询引擎可以自由地丢弃名称(实际上它可能是这样),因此可能会忽略它可能与关键字发生冲突的事实。

编辑:回复您的编辑/评论。 不,两者不相同。 RESULT将是等效的,但获得该结果的过程并不完全相似。 对于第一个工作,解析器做了一些根本没有意义的工作(将聚合应用于单个值,无论是逐行还是作为),在第二种情况下,聚合应用于表格。 表是临时虚拟表的事实对聚合函数来说并不重要。

简单来说,聚合函数在列上运行并生成标量值,因此无法在其结果上应用它们。 当您在标量值上创建select语句时,您其转换为人工列,这就是为什么它可以再次由聚合函数使用。

请注意,大多数情况下,对另一个聚合函数的结果应用聚合函数没有意义:在您的样本sum(count(id)) == count(id)

我想知道你在这个SQL中的预期结果

select  sum(count(id)) as 'count'
from    table

当您使用count功能时,只返回1个结果(总计数)。 那么,请问为什么你要总结只有1个结果。

您肯定会收到错误,因为聚合函数无法对包含聚合或子查询的表达式执行。

我认为你可以编写sql查询,它为所需的输出生成'count'行。 函数不会采用聚合函数,如“sum”或聚合子查询。 通过使用简单的SQL查询来解决我的问题....

Microsoft SQL Server不支持它。

您可以使用Derived表来解决此问题:

select sum(x.count)
from
(
    select  count(id) as 'count'
    from    table   
) x

另一方面,使用下面的代码将给您一个错误消息。

select  sum(count(id)) as 'count'
from    table

无法对包含聚合或子查询的表达式执行聚合函数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM