带有聚合的非常基本的 SQL 脚本 [重复]

Posted

技术标签:

【中文标题】带有聚合的非常基本的 SQL 脚本 [重复]【英文标题】:Very basic SQL script with aggregate [duplicate] 【发布时间】:2016-05-14 13:14:38 【问题描述】:
select Customers.cust_id, count(Orders.cust_id)  
from Customers left outer join Orders  
on Customers.cust_id=Orders.cust_id  
group by Customers.cust_id

这会正确显示所有内容。

select Customers.cust_id, ***Customers.cust_name***, count(Orders.cust_id)  
from Customers left outer join Orders  
on Customers.cust_id=Orders.cust_id  
group by Customers.cust_id  

,,您的查询不包括指定的表达式 'cust_name' 作为聚合函数的端口。"

这是为什么呢?客户中的每个 cust_id 在 cust_name 中都有一个名称。为什么我会收到此错误消息?

【问题讨论】:

Customers 中的每个 cust_id 在 cust_name 中都有一个名称。...Access 不知道这一点。它应该相信你的话吗?只需将 cust_name 添加到 group by 子句,因为所有非聚合列必须指定为聚合 SQL 查询中的分组。 错误消息准确而清楚地告诉您问题出在哪里 - 您的查询不包括 cust_name 作为聚合的一部分函数。这意味着它需要在GROUP BY 子句中列出。您应该学会真正阅读错误消息中的单词;它们几乎总是传达实际意义。规则是:如果它不是聚合的一部分(IOW,不包含在函数中(),如COUNT()AVG()MAX()),则需要在 GROUP BY 中列出。 ...除非您使用的是 mysql,这违反了这里的 ansi 标准。 这经常出现在 Stack Overflow [ms-access] 标签中:***.com/… 【参考方案1】:

当您使用聚合函数 count() 时,所有其他字段(未与聚合函数一起使用)必须出现在 Group By 子句中。


这是我对原因的解释:

聚合函数跨组运行。

(也就是说,除非没有指定组或其他字段,否则默认情况下它们会在整个记录集上运行。例如,SELECT Sum(Salary) FROM Staff 有效。)

如果您按cust_id 分组,那么它知道要输出什么,每个cust_id 的计数。但是它会用cust_name 做什么呢?哪个cust_name 会或应该为每个cust_id 输出显示?如果cust_id 有多个cust_name 怎么办?它只会为每个cust_id 显示一行,那么它旁边应该显示什么名称呢?它不会假设只有一个cust_name 对应于一个cust_id

如果每个cust_id 有一个cust_name,则按两者进行分组将产生相同数量的行(仅cust_id)并提供一致且可靠的行为。

【讨论】:

谢谢。我可以问为什么吗?我真的很想了解它背后的逻辑。 我已经添加了解释。【参考方案2】:
select Customers.cust_id, Customers.cust_name, count(Orders.cust_id)  
from Customers left outer join Orders  
on Customers.cust_id=Orders.cust_id  
group by Customers.cust_id, Customers.cust_name

【讨论】:

以上是关于带有聚合的非常基本的 SQL 脚本 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在sql中使用聚合函数进行SELECT [重复]

SQL Server:以列值为条件的不同聚合函数[重复]

表有重复数据,无法让两个聚合函数在 SQL Query 中工作

为啥 SQL 强制我在 GROUP BY 子句中重复 SELECT 子句中的所有非聚合字段? [关闭]

如何根据重复的行值合并聚合函数结果 | SQL 甲骨文

SQL-如何在聚合操作期间获取每组重复次数最多的文本值?