sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo transformo filas en columnas en el servidor sql 2005?

Hay preguntas similares aquí ,aquí respondido en stackoverflow.

Debe usar el operador PIVOT en su consulta para lograr esto. Aquí está el ejemplo y la explicación de cómo puede hacerlo. Se hace referencia al ejemplo desde esto fuente.

---I assumed your tablename as TESTTABLE---
DECLARE @cols NVARCHAR(2000)
DECLARE @query NVARCHAR(4000)

SELECT  @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
                                '],[' + t.Name
                        FROM    TESTTABLE AS t
                        ORDER BY '],[' + t.Name
                        FOR XML PATH('')
                      ), 1, 2, '') + ']'

SET @query = N'SELECT '+ @cols +' FROM
(SELECT t1.Name , t1.Count FROM TESTTABLE AS t1) p
PIVOT (MAX([Count]) FOR Name IN ( '+ @cols +' ))
AS pvt;'

EXECUTE(@query)

Explicación

1.La primera parte de la consulta

SELECT  @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
                        '],[' + t.Name
                FROM TESTTABLE AS t
                ORDER BY '],[' + t.Name
                FOR XML PATH('')
              ), 1, 2, '') + ']'

le da un buen resultado aplanado de los valores de su columna Nombre en una sola fila de la siguiente manera

[Cheryl],[Drew],[Karen],[Kath],[Kirk],[Matt]  

Puede obtener más información sobre STUFF y XML PATH aquí y aquí .

2.SELECT + @cols + FROM seleccionará todas las filas como nombres de columna para el conjunto de resultados final (pvt - paso 3)

es decir

Select [Chery],[Drew],[Morgan],[Kath],[Kirk],[Matt] 

3.Esta consulta extrae todas las filas de datos que necesitamos para crear los resultados de tabulación cruzada. La (p) después de la consulta está creando una tabla temporal de los resultados que luego se pueden usar para satisfacer la consulta del paso 1.

(SELECT t1.Name, t1.Count FROM  TESTTABLE AS t1) p

4.La expresión PIVOT

PIVOT (MAX (Count) FOR Name IN ( @cols) AS pvt

hace el resumen real y coloca los resultados en una tabla temporal llamada pvt como

Chery | Drew | Morgon | Kath | Kirk | Matt  
-------------------------------------------  
257     1500     13      500    200    76