2010-08-24 4 views
0

У меня есть таблица около 1.6M строк, где записи имеют уникальный идентификатор (идентификатор), а затем также имеют 8-значный «код». Поле кода, которое оно использовало для группировки данных в множества ... все строки с одним и тем же кодом находятся в одном наборе. Каждый набор должен состоять из 12 записей, но, похоже, наша загрузка данных отключена, а некоторые наборы неполны.Подсчет групп данных в SQL

Мне нужно идентифицировать неполные наборы. Как я могу написать запрос, чтобы выбрать только те записи, которые являются частью набора, у которого нет соответствующего количества записей в их наборе (12)?

Я использую MS SQL 2008.

Спасибо.

+2

теперь вы можете выбрать правильный ответ примерно из 20 правильных ответов ;-). Удачи ... –

ответ

6

Попробуйте это ...

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

+1: Ты избил меня на 16 секунд –

+0

Я так долго не ожидал ответа многих. Спасибо всем! Хорошо работает. –

1

Это даст вам отдельные записи, которые должны быть обновлены:

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

Ошибка. Слишком много полей в разделе IN. У вас есть один по сравнению с двумя - MySQL поддерживает кортежи, но я не пробовал его на SQL Server. Это также будет работать по одной и той же таблице дважды, когда это можно сделать за один проход - подзапрос - это все, что вам нужно. –

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 

придираться: != является ANSI-92, против <>

+0

Bah! 14 секунд! – LittleBobbyTables

+0

rofl. хорошо еще проголосуйте за вас, товарищ –

+0

@LittleBobbyTables: вы приближаетесь - почти слишком близко: p –

1

Это идеальный случай за пользование having пункт:

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

Предложение HAVING позволяет ограничить результаты запроса, который включает в себя GROUP BY только для тех записей, которые соответствуют определенному условию. Вы можете рассматривать это как вариант в предложении WHERE, который работает с сгруппированными наборами результатов.

Запрос может включать в себя как WHERE и HAVING пункт - однако, понимать, что предикат в предложении WHERE оценивается прежде чем результаты сгруппированы, в то время как предикат в предложении HAVING вычисляется после.

1

Обратите внимание, что я использовал <>, а не <. Это будет определять коды, которые могут иметь слишком много элементов, а также коды, которые слишком малы.

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

Это должно работать:

select CodeField, count(*) 
    from yourtable 
    group by CodeField 
    having count(*) <> 12 
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 

Наслаждайтесь!

Смежные вопросы