为什么在 SQL Server 中我不能这样做:
select sum(count(id)) as 'count'
from table
但我可以
select sum(x.count)
from
(
select count(id) as 'count'
from table
) x
它们本质上不是一回事吗?为了理解为什么不允许第一个代码块,我应该如何考虑这个问题?
为什么在 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 功能。也许如果你解释你想要达到的目标,有人可以告诉你如何。
问题的要点是没有应用于关系的聚合的聚合这样的概念,请参阅Aggregation。有这样的概念会在定义中留下太多的漏洞,使 GROUP BY 子句无法表达:它需要同时定义内部聚合 GROUP BY 子句和外部聚合!这也适用于其他聚合属性,例如 HAVING 子句。
但是,应用于关系的聚合的结果是另一个关系,而这个结果关系又可以支持新的聚合运算符。这解释了为什么您可以将结果聚合到外部 SELECT 中。这在定义中没有歧义,每个 SELECT 都有自己不同的 GROUP BY/HAVING 子句。
它使用SQLFiddle为我工作,不知道为什么它不适合你。但我确实解释了为什么它可能对你不起作用以及为什么替代方案会起作用......
您的示例使用关键字作为列名,这可能并不总是有效。但是,当列仅在子表达式中时,查询引擎可以自由地丢弃名称(实际上它可能会这样做),因此它可能与关键字潜在冲突的事实可能会被忽略。
编辑:回应您的编辑/评论。不,两者不相等。RESULT 将是等效的,但获得该结果的过程完全不同。对于第一个工作,解析器做了一些对它来说根本没有意义的工作(将聚合应用于单个值,无论是逐行还是作为),在第二种情况下,聚合应用于表。该表是临时虚拟表这一事实对于聚合函数来说并不重要。
简单来说,聚合函数对列进行操作并生成标量值,因此它们不能应用于其结果。当您在标量值上创建选择语句时,会将其转换为人工列,这就是聚合函数可以再次使用它的原因。
请注意,在大多数情况下,将聚合函数应用于另一个聚合函数的结果是没有意义的:在您的 sample 中sum(count(id)) == count(id)
。
我想知道你在这个 sql 中的预期结果
select sum(count(id)) as 'count'
from table
使用该count
函数时,只会返回 1 个结果(总数)。所以,我可以问你为什么要总结唯一的 1 个结果。
您肯定会遇到错误,因为聚合函数无法对包含聚合或子查询的表达式执行。
我认为您可以编写 sql 查询,它会为所需的输出生成“计数”行。函数不采用聚合函数,如“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
无法对包含聚合或子查询的表达式执行聚合函数