2014-02-17 2 views
0

У меня есть таблица, которая включает в себя следующие столбцы:SQL - Поиск строк со значениями дубликатов в одном столбце

Nameplate 
Model 
Segment 

таблица образец выглядит следующим образом:

Nameplate Model Segment 
Acura  ILX Small Lux Car 
Audi  Q5  Compact Lux Car 
Audi  Q5  Mid Lux Car 
Audi  SQ5 Compact Lux Car 

Мне нужно найти все Nameplate, Model комбинации с несколько Segments.

В приведенной выше таблице, мне нужно, чтобы вернуться:

Audi  Q5  Compact Lux Car 
Audi  Q5  Mid Lux Car 

Я думал, что следующее будет работать:

SELECT DISTINCT 
    [Nameplate], [Model], [Segment] 
FROM 
    dbo.[Weighted Extract] 
GROUP BY 
    [Nameplate], [Model], [Segment] 
HAVING 
    COUNT([Segment]) > 1; 

Приведенный выше код возвращает только комбинации с несколькими Nameplate, Model и Segment строк. Это должно быть проще, чем я это делаю, но я застрял.

ответ

-1

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

SELECT [Nameplate], [Model] 
FROM dbo.[Weighted Extract] 
GROUP BY [Nameplate], [Model] 
HAVING COUNT(distinct [Segment]) > 1; 
+0

Не возвращает столбец «Сегмент» по желанию. –

+0

Вот и все! Я пытался добавить сегмент в оператор SELECT, и это было ошибкой. Спасибо за быстрый ответ. – user3319605

+0

@ Мартин - вы правы, но код Кайджина по крайней мере показывает мне, где дубликаты. Показывать сегмент было бы неплохо, но на данный момент это не критично для моих нужд. – user3319605

4

Вы можете использовать EXISTS:

SELECT [Nameplate], [Model], [Segment] 
FROM dbo.[Weighted_Extract] we1 
WHERE EXISTS 
(
    SELECT 1 FROM dbo.[Weighted_Extract] we2 
    WHERE we1.Nameplate = we2.Nameplate 
    AND we1.Model = we2.Model 
    AND we1.Segment <> we2.Segment 
); 

Demo

1

Попробуйте, это должно работать с SQLServer 2005+:

;WITH X AS 
(
    SELECT [Nameplate], [Model], [Segment], 
     count(*) over (partition by [Nameplate], [Model]) cnt 
    FROM dbo.[Weighted Extract] 
) 
SELECT [Nameplate], 
     [Model], 
     [Segment] 
FROM X 
WHERE cnt > 1 
Смежные вопросы