2014-01-14 8 views
0

Edit: Это MS SQL Server 2008SQL Найти дубликаты против конкретных записей

Я хочу найти дубликаты только против определенных записей, в приведенном ниже примере я хочу найти дубликаты против записей, которые имеют Status = 1

Здесь приведен пример набора данных

ID |Name |Status 
------------------------ 
1 |ABC |1 
2 |BAC |1 
3 |CBA |1 
4 |ABC |2 
5 |BAC |5 
6 |BAC |7 
7 |DAE |8 
8 |DAE |2 

То, что я хочу, чтобы это

Name |Count 
----------------- 
ABC  |2 
BAC  |3 

Первоначально я думал использовать этот

SELECT  Name,COUNT(*) 
GROUP BY Name 
HAVING  COUNT(*) > 1 

Но результат будет

Name |Count 
----------------- 
ABC  |2 
BAC  |3 
DAE  |2 

Но это не то, что мне нужно.

+0

Вы также не хотите CBA? –

+0

@GordonLinoff no CBA не дублируется – skmasq

ответ

1

Вы близко. Вы хотите, чтобы изменить положение having только подсчитывать значения, где статус 1:

SELECT  Name, COUNT(*) 
FROM table t 
GROUP BY Name 
HAVING  sum(case when status = 1 then 1 else 0 end) > 0; 

EDIT:

Если вы хотите только вещи с числом больше 1, а также статус 1:

SELECT  Name, COUNT(*) 
FROM table t 
GROUP BY Name 
HAVING  sum(case when status = 1 then 1 else 0 end) > 0 and 
      count(*) > 1; 
+0

Но разве мне не нужно включать Status в select, чтобы иметь возможность их суммировать? – skmasq

+0

Предоставлено @bluefeet, вы можете видеть, как это работает здесь (http://sqlfiddle.com/#!2/2a953/6). Вам не нужно иметь «статус» в 'select' statement'. –

+0

Хорошо, спасибо, вот рабочий пример http://sqlfiddle.com/#!3/f2cbe/1 – skmasq

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