为什么我得到sql server错误“列无效”?

时间:2012-06-10 05:49:21

标签: sql sql-server

请考虑以下代码:

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

当我删除最后一行时,出现以下错误:

  

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

为什么会出现此错误?我犯的错误是什么(理解计数是如何工作的)?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

在不使用分组依据的情况下编写查询的其他方式:

select vend_id, (select COUNT(*) from Products as products1 where products1.vend_id = Products.vend_id) as num_prods
from Products

答案 2 :(得分:0)

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

select vend_id
from Products

select count(vend_id)
from Products

上述两个查询均有效。如果你想选择vend_id并按它计数,你必须按它分组。