Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Converti righe in colonne usando "Pivot" in SQL Server

Se utilizzi SQL Server 2005+, puoi utilizzare il PIVOT funzione per trasformare i dati da righe in colonne.

Sembra che dovrai usare dynamic sql se le settimane sono sconosciute, ma è più facile vedere il codice corretto inizialmente usando una versione hardcoded.

Innanzitutto, ecco alcune definizioni rapide di tabelle e dati da utilizzare:

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 i tuoi valori sono noti, codificherai la query:

select *
from 
(
  select store, week, xCount
  from yt 
) src
pivot
(
  sum(xcount)
  for week in ([1], [2], [3])
) piv;

Vedi Demo SQL

Quindi, se devi generare il numero della settimana in modo dinamico, il tuo codice sarà:

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);

Vedi la demo SQL.

La versione dinamica, genera l'elenco delle week numeri che devono essere convertiti in colonne. Entrambi danno lo stesso risultato:

| STORE |   1 |   2 |   3 |
---------------------------
|   101 | 138 | 282 | 220 |
|   102 |  96 | 212 | 123 |
|   105 |  37 |  78 |  60 |
|   109 |  59 |  97 |  87 |