2012-05-18 6 views
7

Wie kann ich eine (unbekannte) Anzahl von Zeilen in einer einzelnen Zeile gruppieren, wobei die festgelegten Spalten die Gruppierung bestimmen?T-SQL-Gruppenzeilen in Spalten

Zum Beispiel verschieben

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

In

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

Vielen Dank für jede Hilfe

+0

möglich Duplikat von [Wie transformiert Zeilen in Spalten] (http://stackoverflow.com/questions/347624/how-to-transforms-rows-to-columns) – Pondlife

+0

Sie suchen wahrscheinlich nach einem PIVOT oder UNPIVOT . –

Antwort

8

Sie können die Tabelle mit row_number() als Quelle der Spaltennamen schwenken:

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 

einfach die Liste der Nummern verlängern, wenn Sie mehrere Zeilen haben.

Live test is @ Sql Fiddle.

5

Wenn die Anzahl der verschiedenen Links unkown ist dies muss dynamisch erfolgen. Ich denke, das wird je nach Bedarf arbeiten:

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 

Es ist eine leichte varation der üblichen Drehfunktion, weil normalerweise link in dem Spaltenkopf sein würde. Es bestimmt im Wesentlichen die Anzahl der erforderlichen Spalten (d. H. Die maximalen eindeutigen Werte für Link pro Referenz/Name) und pivotiert dann die Werte in diese Spalten.

+1

Ich habe eine * maximale * Anzahl von Links, so dass die obige Antwort in diesem Fall funktioniert. Dies ist jedoch nützlich für zukünftige Referenz - danke. – JBarnes