[英]How can I perform an aggregate function on an expression containing an aggregate or a subquery?
[英]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.