Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Konvertieren Sie Zeilen in Spalten mit „Pivot“ in SQL Server

Wenn Sie SQL Server 2005+ verwenden, können Sie den PIVOT verwenden Funktion, um die Daten von Zeilen in Spalten umzuwandeln.

Es hört sich so an, als müssten Sie dynamisches SQL verwenden, wenn die Wochen unbekannt sind, aber es ist einfacher, den richtigen Code zu sehen, wenn Sie zunächst eine fest codierte Version verwenden.

Hier sind zunächst einige schnelle Tabellendefinitionen und Daten zur Verwendung:

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

Wenn Ihre Werte bekannt sind, werden Sie die Abfrage fest codieren:

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

Siehe SQL-Demo

Wenn Sie dann die Wochennummer dynamisch generieren müssen, lautet Ihr Code:

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

Siehe SQL-Demo.

Die dynamische Version generiert die Liste der week Zahlen, die in Spalten umgewandelt werden sollen. Beide geben das gleiche Ergebnis:

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