计算SQL中的数据组

时间:2010-08-24 15:51:32

标签: sql sql-server tsql sql-server-2008 aggregate-functions

我有一个大约1.6M行的表,其中记录具有唯一(标识)ID,然后还有一个8个字符的“代码”字段。它用于将数据分组的代码字段...具有相同代码的所有行都在同一个集合中。每个集合应包含12个记录,但似乎我们的数据加载已关闭且某些集合不完整。

我需要识别不完整的集合。如何编写查询以仅选择那些在集合中没有正确数量的记录的集合中的那些记录(12)?

我正在使用MS SQL 2008。

感谢。

7 个答案:

答案 0 :(得分:6)

试试这个...

SELECT 
 CodeField, 
 COUNT(CodeField) 
FROM table 
GROUP BY CodeField 
HAVING COUNT(CodeField) < 12

答案 1 :(得分:4)

使用此方法获取表中少于12条记录的代码:

  SELECT yt.code
    FROM YOUR_TABLE yt
GROUP BY yt.code
  HAVING COUNT(*) < 12

对于本练习,您必须使用HAVING子句 - WHERE子句不允许您使用聚合函数(MIN,MAX,COUNT ...)而不使用它们子查询,但HAVING子句没有该限制。

要获取表格中包含少于或多于12条记录的代码,请使用:

  SELECT yt.code
    FROM YOUR_TABLE yt
GROUP BY yt.code
  HAVING COUNT(*) != 12

Nitpick:!=是ANSI-92,而<>

答案 2 :(得分:1)

这将为您提供需要更新的个人记录:

   SELECT *
    FROM MyTable
    WHERE CodeField IN
    (
        SELECT CodeField,
        COUNT(CodeField) AS [Count]
        FROM MyTable
        GROUP BY CodeField
        HAVING COUNT(CodeField) <> 12
    ) 

答案 3 :(得分:1)

这是使用having子句的完美案例:

select codefield, count(*) from YOURTABLE
group by codefield
having count(*) <> 12

HAVING子句允许您将包含GROUP BY的查询结果限制为仅匹配特定条件的记录。您可以将其视为WHERE子句的变体,该子句适用于分组结果集。

查询可以包含WHEREHAVING子句 - 但是,要意识到在WHERE子句中的谓词在结果被分组之前被评估,而HAVING子句中的谓词在{ {1}}子句在。

之后进行评估

答案 4 :(得分:1)

请注意,我使用的是<>而不是<。这将识别可能包含太多项目的代码以及代码太少的代码。

select code, count(*) as count
from MyTable
group by code
having count(*) <> 12

答案 5 :(得分:0)

这应该有效:

  select CodeField, count(*)
    from yourtable
    group by CodeField
    having count(*) <> 12

答案 6 :(得分:0)

你可以用一组来完成这个。如下所示:

select 
  groups.code,
  groups.code_count
 from
    (select 
      code,
      count(code) code_count
    from
     records_table
    group by code)  groups
where 
  groups.code_count != 12

享受!