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

Converter linhas em colunas usando 'Pivot' no SQL Server


Se você estiver usando o SQL Server 2005+, poderá usar o PIVOT função para transformar os dados de linhas em colunas.

Parece que você precisará usar sql dinâmico se as semanas forem desconhecidas, mas é mais fácil ver o código correto usando uma versão codificada inicialmente.

Primeiro, aqui estão algumas definições rápidas de tabela e dados para uso:
CREATE TABLE yt 
(
  [Store] int, 
  [Week] int, 
  [xCount] int
);
    
INSERT INTO yt
(
  [Store], 
  [Week], [xCount]
)
VALUES
    (102, 1, 96),
    (101, 1, 138),
    (105, 1, 37),
    (109, 1, 59),
    (101, 2, 282),
    (102, 2, 212),
    (105, 2, 78),
    (109, 2, 97),
    (105, 3, 60),
    (102, 3, 123),
    (101, 3, 220),
    (109, 3, 87);

Se seus valores forem conhecidos, você codificará a consulta:
select *
from 
(
  select store, week, xCount
  from yt 
) src
pivot
(
  sum(xcount)
  for week in ([1], [2], [3])
) piv;

Veja a demonstração do SQL

Então, se você precisar gerar o número da semana dinamicamente, seu código será:
DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(Week) 
                    from yt
                    group by Week
                    order by Week
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT store,' + @cols + ' from 
             (
                select store, week, xCount
                from yt
            ) x
            pivot 
            (
                sum(xCount)
                for week in (' + @cols + ')
            ) p '

execute(@query);

Consulte Demonstração SQL.

A versão dinâmica, gera a lista de week números que devem ser convertidos em colunas. Ambos dão o mesmo resultado:
| STORE |   1 |   2 |   3 |
---------------------------
|   101 | 138 | 282 | 220 |
|   102 |  96 | 212 | 123 |
|   105 |  37 |  78 |  60 |
|   109 |  59 |  97 |  87 |