2012-05-18 2 views
7

Как я могу группировать (неизвестное) количество строк в одну строку, где заданные столбцы определяют группировку?Строки строк 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 

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

+0

Возможный дубликат [Как преобразовать строки в столбцы] (http://stackoverflow.com/questions/347624/how-to-transform-rows-to-columns) – Pondlife

+0

Возможно, вы ищете PIVOT или UNPIVOT , –

ответ

8

Вы можете поворачивать таблицы с помощью 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 

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

Live test is @ Sql Fiddle.

5

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

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 

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

+1

У меня есть * максимальное количество ссылок, поэтому приведенный выше ответ работает в этом случае. Однако это полезно для будущей справки - спасибо. – JBarnes

Смежные вопросы