2012-05-18 11 views
7

Come posso raggruppare un numero (sconosciuto) di righe in una singola riga in cui le colonne impostate determinano il raggruppamento?Gruppo T-SQL righe nelle colonne

Per esempio, spostare

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

Into

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

Grazie per qualsiasi aiuto

+0

possibile duplicato di [Come trasformare righe in colonne] (http://stackoverflow.com/questions/347624/how-to-transform-rows-to-columns) – Pondlife

+0

Probabilmente stai cercando un PIVOT o UNPIVOT . –

risposta

8

si potrebbe ruotare la tabella utilizzando row_number() come fonte di nomi di colonne:

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 

semplicemente estendere l'elenco dei numeri se si dispone di più righe.

Live test is @ Sql Fiddle.

5

Se il numero di diversi Links è sconosciuta questo deve essere fatto in modo dinamico. Credo questo funzionerà come richiesto:

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 

È un lieve varation della funzione PIVOT solito perché normalmente link sarebbe nell'intestazione della colonna. Determina fondamentalmente il numero di colonne richieste (vale a dire i valori massimi distinti per Link per ref/Name), quindi ruota i valori in queste colonne.

+1

Ho un numero * massimo * di link, quindi la risposta sopra funziona in questo caso. Tuttavia, questo è utile per riferimenti futuri - grazie. – JBarnes

Problemi correlati