带有聚合的非常基本的 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 Query 中工作