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

问题描述 投票:0回答:8

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

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

但是我可以

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

它们本质上不是同一件事吗?我该如何思考这个问题才能理解为什么不允许使用第一块代码?

sql sql-server sql-server-2008 t-sql sql-server-2005
8个回答
15
投票

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

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


8
投票

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

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


1
投票

简单来说,聚合函数对列进行操作并生成标量值,因此它们不能应用于其结果。当您对标量值创建 select 语句时,您将其转换为人工列,这就是它可以再次被聚合函数使用的原因。

请注意,大多数时候,对另一个聚合函数的结果应用聚合函数是没有意义的:在您的示例中

sum(count(id)) == count(id)


1
投票

我想知道你在这个sql中的预期结果是什么

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

当您使用

count
函数时,只会返回1个结果(总数)。那么,我可以问你为什么要对唯一的 1 个结果求和吗?

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


1
投票

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

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

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


0
投票

获取日志,scanLimitGBytes:-1,来自:-1h |过滤 matchesValue(k8s.namespace.name, "merch-item-prod") 和 matchesValue(k8s.container.name, "vendor-portal") |过滤器包含(内容,“调度程序已在运行”) |汇总计数,别名:count


-1
投票

我认为您可以编写 sql 查询,它会生成所需输出的“计数”行。函数不采用“sum”或聚合子查询等聚合函数。通过使用简单的 sql 查询来获取计数,我的问题得到了解决....


-6
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.