考虑下面的代码:
select vend_id, COUNT(vend_id) as num_prods
from Products
group by vend_id
当我删除最后一行时,我收到以下错误:
列“Products.vend_id”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
为什么我会收到此错误?我犯了什么错误(理解 count 的工作原理)?
考虑下面的代码:
select vend_id, COUNT(vend_id) as num_prods
from Products
group by vend_id
当我删除最后一行时,我收到以下错误:
列“Products.vend_id”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
为什么我会收到此错误?我犯了什么错误(理解 count 的工作原理)?
计数是一个聚合函数。
它返回查询定义的集合中的项目数。
如果查询中没有列,count 将只计算查询返回的总行数。
如果将其他列添加到选择列表中,则需要添加一个 group by 语句以赋予计数含义。Group by 告诉聚合函数对 group by 语句中的列具有相同值的所有行进行操作。
您在问题中提供的查询将返回唯一 vend_id 值的列表以及这些值在给定表中存在的次数。如果 vend_id 列是该表上的唯一键,那么您将只获得一个 vend_id 列表和每行 1 的列表。
COUNT函数的详细解释请看这篇文档:http: //msdn.microsoft.com/en-us/library/ms175997 (v=sql.105).aspx
有关聚合函数的说明,请参阅本文档,一般来说: http: //msdn.microsoft.com/en-us/library/ms173454 (v=sql.105).aspx
在不使用 Group By 的情况下编写查询的替代方法:
select vend_id, (select COUNT(*) from Products as products1 where products1.vend_id = Products.vend_id) as num_prods
from Products
您收到错误是因为当您从查询中删除最后一行时,您在聚合函数count(vend_id)
和非聚合函数中都选择了 vend_id vend_id
。您要求一列总计(计数一)和一详细信息(不计数)。您需要告诉 SQL Server 如何处理任何未总计的列。
select vend_id
from Products
select count(vend_id)
from Products
上面的两个查询都是有效的。如果要选择 vend_id 并按它计数,则必须按它分组。