-1

考虑下面的代码:

select vend_id, COUNT(vend_id) as num_prods
from Products
group by vend_id

当我删除最后一行时,我收到以下错误:

列“Products.vend_id”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

为什么我会收到此错误?我犯了什么错误(理解 count 的工作原理)?

4

3 回答 3

2

计数是一个聚合函数。

它返回查询定义的集合中的项目数。

如果查询中没有列,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

于 2012-06-10T05:55:36.177 回答
0

在不使用 Group By 的情况下编写查询的替代方法:

select vend_id, (select COUNT(*) from Products as products1 where products1.vend_id = Products.vend_id) as num_prods
from Products
于 2012-06-10T05:53:20.467 回答
0

您收到错误是因为当您从查询中删除最后一行时,您在聚合函数count(vend_id)和非聚合函数中都选择了 vend_id vend_id。您要求一列总计(计数一)和一详细信息(不计数)。您需要告诉 SQL Server 如何处理任何未总计的列。

select vend_id
from Products

select count(vend_id)
from Products

上面的两个查询都是有效的。如果要选择 vend_id 并按它计数,则必须按它分组。

于 2012-06-10T05:55:55.577 回答