chints786 Ответов: 3

Sql-запрос для получения значений, разделенных запятой


Привет,

У меня есть таблица, состоящая из 2 столбцов

id & цвет

значения для них следующие:-

цвет удостоверения личности
1 черный
1 белый цвет
1 синий
2 Красный
3 пурпурный
3 фиолетовый

Требуемый выход таков :-
цвет удостоверения личности
1 черный;белый;синий
2 Красный
3 пурпурный;фиолетовый

Пожалуйста помочь.

Что я уже пробовал:

Я попытался с помощью функции Stuff через запятую.

OriginalGriff

По какой-то причине я не могу опубликовать сообщение в качестве решения ... давайте попробуем в качестве комментария...

Попробовать это:

SELECT ID, 
       Color = STUFF((SELECT ', ' + Color
                      FROM MyTable b 
                      WHERE b.Id = a.Id 
                      FOR XML PATH('')), 1, 2, '')
FROM MyTable a
GROUP BY Id

3 Ответов

Рейтинг:
2

MadMyche

Вы находитесь на правильном пути с STUFF, и то, что вам нужно сделать, это поместить это в подзапрос

доказательство концепции

DECLARE @table TABLE (ID int, color varchar(16))

INSERT @table VALUES (1, 'black'),  ( 1, 'white'),  ( 1, 'blue'),  ( 2, 'red'),  ( 3, 'magenta'),  ( 3, 'purple')

SELECT  t.ID
  ,     Colors = STUFF(
          (  SELECT  ', ' + s.color 
             FROM    @table s
             WHERE  s.ID = t.ID
             FOR XML PATH('')
          ), 1, 1, ''
        )

FROM      @table t
GROUP BY  t.ID
ORDER BY  1
Который возвращается
ID  Colors
==  ===================  
1   black, white, blue
2   red
3   magenta, purple


Рейтинг:
2

OriginalGriff

Попробовать это:

SELECT ID, 
       Color = STUFF((SELECT ', ' + Color
                      FROM MyTable b 
                      WHERE b.Id = a.Id 
                      FOR XML PATH('')), 1, 2, '')
FROM MyTable a
GROUP BY Id


Рейтинг:
2

Richard Deeming

Несколько методов, описанных здесь:
Конкатенация значений строк в Transact-SQL - Simple Talk[^]

Напр.:

SELECT
    t1.id,
    STUFF
    (
        (
            SELECT ';' + t2.color
            FROM YourTable As t2
            WHERE t2.id = t1.id
            ORDER BY t2.color
            FOR XML PATH(''), TYPE
        ).value('.', 'varchar(max)'),
        1, 1, ''
    ) As color
FROM
    YourTable As t1
GROUP BY
    id
;
Как Stuff и 'For Xml Path' работают в Sql Server - Stack Overflow[^]

Или, если вы используете SQL Server 2017 или более позднюю версию:
STRING_AGG (Transact-SQL) - SQL Server | Microsoft Docs[^]
SELECT
    id,
    STRING_AGG(color, ';') As color
FROM
    YourTable
GROUP BY
    id
;