2012-05-18 20 views
7

¿Cómo puedo grupo un número (desconocido) de filas en una sola fila en la que las columnas del conjunto determinan la agrupación?filas de T-SQL en columnas Grupo

Por ejemplo, cambiar

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

En

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

Gracias por cualquier ayuda

+0

posible duplicado de [Cómo transformar filas en columnas] (http://stackoverflow.com/questions/347624/how-to-transform-rows-to-columns) – Pondlife

+0

Probablemente esté buscando un PIVOT o UNPIVOT . –

Respuesta

8

que te pueden pivotar la tabla usando row_number() como fuente de nombres de columna:

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 

simplemente ampliar la lista de números si usted tiene más filas.

Live test is @ Sql Fiddle.

5

Si el número de diferentes enlaces es desconocida esto tiene que ser hecho de forma dinámica. Creo que esto va a funcionar como se requiere:

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 un ligero varation de la función de pivote habitual, ya que normalmente habría link en el encabezado de la columna. Básicamente determina el número de columnas requeridas (es decir, los valores distintivos máximos para Enlace por ref/Nombre) y luego pivota los valores en estas columnas.

+1

Tengo un * máximo * número de enlaces, por lo que la respuesta anterior funciona en este caso. Sin embargo, esto es útil para futuras referencias, gracias. – JBarnes