Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como faço para transformar linhas em colunas no sql server 2005


Há perguntas semelhantes aqui ,aqui respondido no stackoverflow.

Você precisa usar o operador PIVOT em sua consulta para conseguir isso. Aqui está o exemplo e a explicação de como você pode fazer isso. O exemplo é referenciado em isto fonte.
---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)

Explicação

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

fornece um bom resultado achatado dos valores da coluna Nome em uma única linha, como segue
[Cheryl],[Drew],[Karen],[Kath],[Kirk],[Matt]  

Você pode aprender mais sobre STUFF e XML PATH aqui e aqui .

2.SELECT + @cols + FROM irá selecionar todas as linhas como nomes de coluna para o conjunto de resultados final (pvt - passo 3)

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

3.Esta consulta extrai todas as linhas de dados de que precisamos para criar os resultados da tabela cruzada. O (p) após a consulta está criando uma tabela temporária dos resultados que podem ser usados ​​para satisfazer a consulta da etapa 1.
(SELECT t1.Name, t1.Count FROM  TESTTABLE AS t1) p

4. A expressão PIVOT
PIVOT (MAX (Count) FOR Name IN ( @cols) AS pvt

faz a sumarização real e coloca os resultados em uma tabela temporária chamada pvt como
Chery | Drew | Morgon | Kath | Kirk | Matt  
-------------------------------------------  
257     1500     13      500    200    76