正确使用COUNT来计算SELECT语句中返回的行数

时间:2013-08-23 14:17:50

标签: sql-server sql count

SELECT FirstName,
       MiddleName,
       LastName,
       COUNT(*) AS 'Count'
FROM Person.Person TABLESAMPLE(10 PERCENT)

给我错误

  

Msg 8120,Level 16,State 1,Line 1列'Person.Person.FirstName'   在选择列表中无效,因为它不包含在任何一个中   聚合函数或GROUP BY子句。

有人可以解释我做错了吗?

2 个答案:

答案 0 :(得分:4)

SELECT FirstName, MiddleName, LastName, 
  [count] = COUNT(*) OVER()
 FROM Person.Person 
 TABLESAMPLE (10 PERCENT);

虽然您可能更喜欢以下内容,但由于TABLESAMPLE存在一些问题IIRC(对我来说,TABLESAMPLE每次都会返回不可预测的行数,这也会阻止您计算整个表中的行数):

SELECT TOP 10 PERCENT FirstName, MiddleName, LastName,
  [count] = COUNT(*) OVER()
 FROM Person.Person 
 ORDER BY [something];

如果您真的想要一组随机行,可以使用ORDER BY NEWID();。如果您想要查询返回的实际计数,而不是实际表中的行数,只需按照您的查询(没有COUNT聚合):

SELECT @@ROWCOUNT;

另外,请不要将'single quotes'用于列别名 - 在某些情况下不推荐使用此语法,并且使别名看起来像字符串文字。当您需要转义别名,因为它们是关键字或包含空格或违反标识符规则时,请使用[square brackets]

答案 1 :(得分:2)

每次你要使用任何聚合函数(sum,count,avg等)时,你必须识别你的GROUP子句;

在您的查询中,您要确定每个名字,中间名和姓氏的行数:

    SELECT FirstName,
    MiddleName,
    LastName,
    COUNT(*) AS 'Count'
    FROM Person.Person TABLESAMPLE(10 PERCENT)
    GROUP BY FirstName, MiddleName,LastName;

如果你想知道你有多少人:

   SELECT COUNT(*) AS 'Count'
   FROM Person.Person TABLESAMPLE(10 PERCENT);