Суммируйте список в строку через запятую - PullRequest
2 голосов
/ 21 марта 2012

Это текущий результат, который можно менять изо дня в день

    (int)   (nvarchar)
    Number   Grade
    --------------
         1       a
         1       c
         2       a
         2       b
         2       c
         3       b
         3       a

Мне нужна помощь для достижения этого результата ниже.

Number      Grade
-----------------
     1       a, c
     2    a, b, c
     3       b, a

Ответы [ 2 ]

5 голосов
/ 21 марта 2012

Использование:

declare @t table(Number int, Grade varchar)

insert @t values(1, 'a'), (1, 'c'), (2, 'a'), (2, 'b'), (2, 'c'),
(3, 'b'), (3, 'a')

select t1.Number
    , stuff((
        select ',' + Grade
        from @t t2
        where t2.Number = t1.Number
        for xml path(''), type
    ).value('.', 'varchar(max)'), 1, 1, '') [values]
from @t t1
group by t1.Number
3 голосов
/ 21 марта 2012

Очевидно, вам нужно заменить dbo.tablename на вашу фактическую таблицу.Также я предполагаю, что вы используете SQL Server 2005 или выше - всегда полезно указывать.

SELECT Number, Grades = STUFF((
    SELECT ', ' + Grade FROM dbo.tablename
    WHERE Number = x.Number 
    FOR XML PATH(''), TYPE).value('.[1]', 'nvarchar(max)'), 1, 2, '')
FROM dbo.tablename AS x
GROUP BY Number;

В SQL Server 2017 и Azure SQL Database вы можете использовать новую функцию агрегирования STRING_AGG(), что в данном случае намного лучше:

SELECT Number, Grades = STRING_AGG(Grade,',')
  FROM dbo.tablename
  GROUP BY Number;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...