用count()构建sql查询,其中count()是> 1

时间:2012-01-05 22:26:36

标签: sql-server tsql

如果我有一个表有重复ID的表,我如何计算表中相同ID出现的次数,并且只显示计数大于1的记录?

我试过了:

SELECT COUNT(ID) AS myCount FROM myTbl
WHERE myCount > 1 GROUP BY ID

但是它说myCount是无效的列名。有人能告诉我我做错了吗?

2 个答案:

答案 0 :(得分:11)

您需要使用HAVING关键字:

SELECT COUNT(ID) AS myCount FROM myTbl
GROUP BY ID
HAVING COUNT(ID) > 1

来自MSDN:

  

指定组或聚合的搜索条件。可以   仅用于SELECT语句。 HAVING通常用于   GROUP BY子句。当不使用GROUP BY时,HAVING的行为类似于   WHERE子句。

答案 1 :(得分:0)

您需要了解l 逻辑查询处理阶段。 以下是主要查询子句 按您应键入的顺序指定(称为“键入顺序”):

  1. 选择
  2. 在哪里
  3. 组别
  4. 拥有
  5. ORDER BY

逻辑查询处理顺序,即概念解释 顺序,是不同的。它从FROM子句开始。这是逻辑查询处理 六个主要查询子句的顺序:

  1. 在哪里
  2. 组别
  3. 拥有
  4. 选择
  5. ORDER BY

一个不了解逻辑查询处理的人犯的典型错误是 在WHERE子句中引用SELECT子句中定义的列别名。您 无法执行此操作,因为WHERE子句在SELECT子句之前先求值。

如果您了解WHERE子句是在SELECT子句之前求值的,则您会意识到 该尝试是错误的,因为在此阶段,属性 myCount 尚不存在。

了解WHERE和HAVING之间的区别很重要。哪里 子句在对行进行分组之前进行评估,因此按行进行评估。

将行分组后将评估HAVING子句,因此将按组进行评估。 HAVING(按组评估):

  • 可以包含聚合函数
  • 分组后执行(不包括分组后的记录)
  • 没有GROUP BY不能使用

另一方面,在哪里

  • 不能包含聚合函数(如您的情况)
  • 在FROM之后进行处理
  • 可以在不使用GROUP BY的情况下使用

因此您的查询应如下所示:

SELECT COUNT(ID) AS myCount FROM myTbl
GROUP BY ID
HAVING COUNT(ID) > 1

注意:请注意,ORDER BY子句是允许引用列的第一个也是唯一的子句 SELECT子句中定义的别名。那是因为ORDER BY子句是唯一的子句 在SELECT子句之后进行求值。