TSQL — значения, разделенные запятыми, для определенного столбца

Я хочу решить проблему, когда у меня есть таблица SQL со следующим определением таблицы:

UniqueID    GroupID   DepartmentID
-----------------------------------
    1          2      D005
    2          2      D006
    3          2      D007
    4          5      D002
    5          1      D006
    6          3      D001
    7          3      D009
    8          3      D002
    9          3      D004
   10          3      D006

В этой таблице хранится информация о разных отделах, входящих в определенную группу.

Я ищу простой и оптимизированный запрос, который выводит список отделов в виде значений, разделенных запятыми (в той же строке) для каждой группы. Вывод должен быть таким:

GroupID      DepartmentList
-----------------------------
   2         D005,D006,D007
   5         D002
   1         D006
   3         D001,D009,D002,D004,D006

person Xohayb    schedule 14.10.2018    source источник
comment
Здесь нет определения таблицы   -  person jtate    schedule 15.10.2018
comment
@jtate Я новичок в переполнении стека, я не смог применить соответствующее форматирование, поэтому я вставил свои определения таблиц в виде таблиц HTML. Вы можете запустить фрагменты кода, чтобы просмотреть определение таблицы, а также желаемый результат.   -  person Xohayb    schedule 15.10.2018
comment
Если вы используете SQL Server 2017, есть STRING_AGG. Если нет, существует множество обходных путей для старых версий SQL Server.   -  person Code Different    schedule 15.10.2018
comment
Вы действительно должны проверить - этот вопрос уже задавался 1000 раз, и каждый раз вы получаете один и тот же (правильный) ответ. И, кстати, ответ выполнил работу по созданию операторов вставки - всем будет намного проще, если вы добавите их в свой вопрос в первую очередь.   -  person TomC    schedule 15.10.2018


Ответы (1)


Я использовал следующее определение таблицы.

IF EXISTS(SELECT * FROM [sys].[objects] WHERE [object_id]=OBJECT_ID(N'Table1') AND [TYPE]=N'U')
DROP TABLE Table1
; 

CREATE TABLE Table1
(
  [UniqueID] [int]
, [GroupID] [int]
, [DepartmentID] [varchar](4) NULL
);

INSERT INTO Table1 ([UniqueID], [GroupID], [DepartmentID]) VALUES(1, 2, 'D005');
INSERT INTO Table1 ([UniqueID], [GroupID], [DepartmentID]) VALUES(2, 2, 'D006');
INSERT INTO Table1 ([UniqueID], [GroupID], [DepartmentID]) VALUES(3, 2, 'D007');
INSERT INTO Table1 ([UniqueID], [GroupID], [DepartmentID]) VALUES(4, 5, 'D002');
INSERT INTO Table1 ([UniqueID], [GroupID], [DepartmentID]) VALUES(5, 1, 'D006');
INSERT INTO Table1 ([UniqueID], [GroupID], [DepartmentID]) VALUES(6, 3, 'D001');
INSERT INTO Table1 ([UniqueID], [GroupID], [DepartmentID]) VALUES(7, 3, 'D009');
INSERT INTO Table1 ([UniqueID], [GroupID], [DepartmentID]) VALUES(8, 3, 'D002');
INSERT INTO Table1 ([UniqueID], [GroupID], [DepartmentID]) VALUES(9, 3, 'D004');
INSERT INTO Table1 ([UniqueID], [GroupID], [DepartmentID]) VALUES(10, 3, 'D006');

Чтобы запустить его в одном выражении, я использовал CTE с выбором из значений. Затем я использовал STUFF для объединения строковых значений.

WITH
source_data
AS
(
    SELECT Table1.* FROM (VALUES
      ( 1, 2, 'D005')
    , ( 2, 2, 'D006')
    , ( 3, 2, 'D007')
    , ( 4, 5, 'D002')
    , ( 5, 1, 'D006')
    , ( 6, 3, 'D001')
    , ( 7, 3, 'D009')
    , ( 8, 3, 'D002')
    , ( 9, 3, 'D004')
    , ( 10, 3, 'D006')
    ) Table1 ([UniqueID], [GroupID], [DepartmentID]) 
)
SELECT DISTINCT
      [GroupID]
    , [DepartmentList] = STUFF
    ( 
        (
            SELECT 
                ',' + id2.[DepartmentID] 
            FROM 
                source_data AS id2
            WHERE 
                id1.[GroupID] = id2.[GroupID]
            GROUP BY 
                id2.[DepartmentID]
            FOR XML PATH(''), TYPE
        ).value('.', 'varchar(max)')
        ,1,1,''
    )
FROM 
    source_data AS id1

db‹>скрипка

Результаты:

скриншот

person aduguid    schedule 14.10.2018
comment
Это работает идеально для меня. Спасибо за то, что довели это до такой степени, что мне было легко понять. Спасибо - person Xohayb; 15.10.2018
comment
Не беспокойся, приятель, в любое время - person aduguid; 15.10.2018