T-SQL группирует строки в столбцы

Как я могу сгруппировать (неизвестное) количество строк в одну строку, где заданные столбцы определяют группировку?

например, сдвиг

Ref      Name            Link
==============================
1        John            L1
1        John            L2
1        John            L8
2        Steve           L1
2        Steve           L234

В

Ref      Name            ...    ...    ...
==========================================
1        John            L1     L2     L8
2        Steve           L1     L234   NULL

Спасибо за любую помощь


person JBarnes    schedule 18.05.2012    source источник
comment
возможный дубликат Как преобразовать строки в столбцы   -  person Pondlife    schedule 18.05.2012
comment
Вероятно, вы ищете PIVOT или UNPIVOT.   -  person Chris Gessler    schedule 18.05.2012


Ответы (2)


Вы можете повернуть таблицу, используя row_number() в качестве источника имен столбцов:

select *
from
(
  select ref, 
         name, 
         link,
         row_number() over (partition by ref, name order by link) rn
  from table1
) s
pivot (min (link) for rn in ([1], [2], [3], [4])) pvt

Просто расширьте список чисел, если у вас больше строк.

Живой тест @ Sql Fiddle.

person Nikola Markovinović    schedule 18.05.2012

Если количество различных ссылок неизвестно, это необходимо сделать динамически. Я думаю, что это будет работать по мере необходимости:

DECLARE @SQL NVARCHAR(MAX) = ''
SELECT  @SQL = @SQL + ',' + QUOTENAME(Rownumber)
FROM    (   SELECT  DISTINCT ROW_NUMBER() OVER(PARTITION BY Ref, Name ORDER BY Link) [RowNumber]
            FROM    yourTable
        ) d

SET @SQL = 'SELECT  *
            FROM    (   SELECT  Ref, 
                                name, 
                                Link, 
                                ROW_NUMBER() OVER(PARTITION BY Ref, Name ORDER BY Link) [RowNumber]
                        FROM    yourTable
                    ) data
                    PIVOT
                    (   MAX(Link)
                        FOR RowNumber IN (' + STUFF(@SQL, 1, 1, '') + ')
                    ) pvt'

EXECUTE SP_EXECUTESQL @SQL

Это небольшая вариация обычной функции PIVOT, потому что обычно link будет в заголовке столбца. В основном он определяет количество необходимых столбцов (т. е. максимальное количество уникальных значений для ссылки на ссылку/имя), а затем сводит значения в эти столбцы.

person GarethD    schedule 18.05.2012
comment
У меня есть максимальное количество ссылок, поэтому приведенный выше ответ работает в этом случае. Тем не менее, это полезно для дальнейшего использования - спасибо. - person JBarnes; 18.05.2012