Объединение нескольких полей в одно текстовое поле в SQL Server

Итак, у меня есть таблица, которая выглядит так:

Name                 ID           TaskID           HoursAssigned
----------------------------------------------------------------
John Smith           4592         A01              40
Matthew Jones        2863         A01              20
Jake Adams           1182         A01              100
Matthew Jones        2863         A02              50
Jake Adams           2863         A02              10

и я хочу вернуть набор данных, который выглядит так:

TaskID               PeopleAssigned
------------------------------------------------------------
A01                  Jake Adams, John Smith, Matthew Jones
A02                  Matthew Jones, Jake Adams

Проблема здесь в том, что я понятия не имею, сколько людей назначено на данную задачу. Любые предложения были бы замечательными!


person Matthew Jones    schedule 03.06.2009    source источник
comment
Что с голосованием вниз? Я уже сказал, что есть еще один вопрос, который отвечает на этот.   -  person Matthew Jones    schedule 04.06.2009
comment
+1, они здесь жестоки к людям   -  person KM.    schedule 04.06.2009


Ответы (4)


Этот вопрос задают здесь каждый день. Вот вчерашний. И еще один

https://stackoverflow.com/questions/tagged/sql+string-concatenation

person Cade Roux    schedule 03.06.2009
comment
Верно! Я пропустил их. Виноват! Заключительный вопрос. - person Matthew Jones; 04.06.2009
comment
Нет проблем — поиск и теги на этом сайте еще не работают достаточно хорошо, чтобы люди могли найти эти примеры, прежде чем задавать вопрос. - person Cade Roux; 04.06.2009

ПОПРОБУЙ ЭТО:

declare @table table (name varchar(30), ID int, TaskID char(3), HoursAssigned int)

insert into @table values ('John Smith'   ,4592 ,'A01'  ,40)
insert into @table values ('Matthew Jones',2863 ,'A01'  ,20)
insert into @table values ('Jake Adams'   ,1182 ,'A01'  ,100)
insert into @table values ('Matthew Jones',2863 ,'A02'  ,50)
insert into @table values ('Jake Adams'   ,2863 ,'A02'  ,10)

--formatted so you can see what is happening
SELECT DISTINCT
    t1.TaskID
       ,SUBSTRING(
                  replace(
                          replace(
                                  (SELECT
                                       t2.Name
                                       FROM @Table AS t2
                                       WHERE t1.TaskID=t2.TaskID
                                       ORDER BY t2.Name
                                       FOR XML PATH(''))
                                 ,'</NAME>','')
                         ,'<NAME>',', ')
                 ,3,2000)  AS PeopleAssigned
    FROM @table AS t1

НА ОСНОВЕ ВЧЕРАЧЕГО ОТВЕТА!

вот результат:

(1 row(s) affected)

(1 row(s) affected)

(1 row(s) affected)

(1 row(s) affected)

(1 row(s) affected)
TaskID PeopleAssigned
------ --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
A01    Jake Adams, John Smith, Matthew Jones
A02    Jake Adams, Matthew Jones

(2 row(s) affected)
person KM.    schedule 03.06.2009

И кстати, хранить имена в одном поле — плохая идея. Очень затрудняет запрос. Как бы вы эффективно искали «Смит» без использования подстановочных знаков в качестве первого символа, который не позволяет базе данных использовать индексы. И если имена хранятся в произвольной форме таким образом, человек может быть «Джон Смит», «Смит, Джон», «Смит, Джон», «Смит, Джон» и т. д., и вы не поймете, что это один и тот же человек. Вы должны как минимум иметь имя, отчество, фамилию, личный_суффикс, а затем у вас может быть вычисляемое поле, которое показывает полное имя в формате, который вы хотите отобразить.

person HLGEM    schedule 03.06.2009
comment
Да, на самом деле я не храню данные таким образом, это было просто для простоты. - person Matthew Jones; 04.06.2009

Я новичок в sql и новичок в stackoverflow, но разве это не сработает?

ВЫБЕРИТЕ идентификатор задачи, имя ИЗ таблицы СГРУППИРОВАТЬ ПО идентификатору задачи

person Community    schedule 03.06.2009