2016-02-03 3 views
2

Моя таблица содержит данные, как с двумя полями:Как объединить много строк с одинаковым идентификатором в sql?

ID  DisplayName 
1  Editor 
1  Reviewer 
7  EIC 
7  Editor 
7  Reviewer 
7  Editor 
19  EIC 
19  Editor 
19  Reviewer 

Я хочу, чтобы получить уникальные детали с DisplayName как

1 Editor,Reviewer 7 EIC,Editor,Reviewer

Не получить повторяющееся значение с ID 7

Как объединить данные DisplayName? Как написать запрос?

+0

Какой это? mysql или sql-server? – sagi

+0

@sagi: Я имею в виду сервер sql –

+0

Вы хотите иметь 2 столбца, как сейчас? 'ID' и' DisplayName' только для одного и того же идентификатора вы хотите иметь отдельные имена запятой? Или вы хотите получить все результаты в одной строке, как вы писали? –

ответ

8

В SQL-сервер вы можете сделать это в следующем:

QUERY

SELECT id, displayname = 
    STUFF((SELECT DISTINCT ', ' + displayname 
      FROM #t b 
      WHERE b.id = a.id 
      FOR XML PATH('')), 1, 2, '') 
FROM #t a 
GROUP BY id 

TEST DATA

create table #t 
(
id int, 
displayname nvarchar(max) 
) 

insert into #t values  
(1 ,'Editor') 
,(1 ,'Reviewer') 
,(7 ,'EIC') 
,(7 ,'Editor') 
,(7 ,'Reviewer') 
,(7 ,'Editor') 
,(19,'EIC') 
,(19,'Editor') 
,(19,'Reviewer') 

ВЫВОД

id displayname 
1 Editor, Reviewer 
7 Editor, EIC, Reviewer 
19 Editor, EIC, Reviewer 
7
DECLARE @t TABLE 
(
    ID INT, 
    DisplayName VARCHAR(50) 
) 
INSERT INTO @t (ID, DisplayName) 
VALUES 
    (1 , 'Editor'), 
    (1 , 'Reviewer'), 
    (7 , 'EIC'), 
    (7 , 'Editor'), 
    (7 , 'Reviewer'), 
    (7 , 'Editor'), 
    (19, 'EIC'), 
    (19, 'Editor'), 
    (19, 'Reviewer') 

SELECT *, STUFF((
      SELECT DISTINCT ', ' + DisplayName 
      FROM @t 
      WHERE ID = t.ID 
      FOR XML PATH('')), 1, 2, '') 
FROM (
    SELECT DISTINCT ID 
    FROM @t 
) t 

Выход -

----------- ------------------------ 
1   Editor, Reviewer 
7   Editor, EIC, Reviewer 
19   Editor, EIC, Reviewer 

Мой пост о агрегации строки:

http://www.codeproject.com/Articles/691102/String-Aggregation-in-the-World-of-SQL-Server

0

Спасибо всем,

SELECT Distinct 
    t1.ID, 
    MAX(STUFF(t2.x_id,1,1,'')) AS DisplayName 
FROM Table t1 
CROSS apply(
    SELECT Distinct ', ' + SUBSTRING(t2.DisplayName,1,2) 
    FROM Table t2 
    WHERE t2.ID = t1.ID AND t2.DisplayName > '' 
    FOR xml PATH('') 
) AS t2 (x_id) 
GROUP BY 
    t1.ID 
order by 1 
GO 
+0

Просто так вы знаете. Когда в таблице будет много строк, этот метод будет намного медленнее, чем ответы Деварта и Стэна –

1

и в случае Oracle Database

select id, 
     listagg(displayname, ',') within group (order by displayname) as names 
from test 
group by id 
Смежные вопросы