2013-05-13 1 views
3

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

ID employeename 
1 Jane 
2 Peter 
3 David 
4 Jane 
5 Peter 
6 Jane 

В столбце ID имеет уникальные значения для каждой строки.

В колонке employeename есть дубликаты.

Я хочу, чтобы найти дубликаты на основе столбца employeename и перечислить ID s дубликатов рядом с ними через запятую.

Ожидаемый результат для приведенных выше данных образца:

employeename IDs 
Jane   1,4,6 
Peter   2,5 

Есть другие столбцы в таблице, что я делать не хочу, чтобы рассмотреть для этого запроса.

Спасибо за вашу помощь!

+0

Там должно быть по крайней мере, 100 Дубликаты этот вопрос (но я тоже, я слишком ленив, чтобы искать их). –

ответ

6
select 
employeename, 
IDs = STUFF((SELECT ','+ CAST(e2.[ID] AS VARCHAR(10)) 
    FROM emp e2 
    WHERE e2.employeename = e1.employeename 
    For XML PATH('') 
),1,1,'') 
FROM emp e1 
GROUP BY employeename having COUNT(*) > 1 

SQL Fiddler

+0

Спасибо @EricZ! Это то, что я искал! – slayernoah

+0

Как насчет использования CTE? "с CTE as (выберите row_number() over (partition by employeename order by ID) как rn из таблицы)" - как продолжить? –

+0

@HelenCraigman, не уверен, что вы хотите сделать с CTE, что запрос показывает номер строки. Для конкатенации строк FOR XML лучше. – EricZ

0

Вот пример Борей:

Use Northwind 
GO 

SELECT 
    ord1.CustomerID, 
    OrderIdList = substring((SELECT (', ' + convert(varchar(16) , OrderID)) 
          FROM [dbo].[Orders] ord2 
          WHERE ord1.CustomerID = ord2.CustomerID 
          ORDER BY 
           CustomerID, 
           OrderID 
          FOR XML PATH('') 
         ), 3, 1000)FROM [dbo].[Orders] ord1 
GROUP BY CustomerID 
Смежные вопросы