sql >> Databasteknik >  >> RDS >> Sqlserver

Konvertera rader till kolumner med "Pivot" i SQL Server

Om du använder SQL Server 2005+ kan du använda PIVOT funktion för att omvandla data från rader till kolumner.

Det låter som att du kommer att behöva använda dynamisk sql om veckorna är okända men det är lättare att se rätt kod med en hårdkodad version initialt.

Först och främst, här är några snabba tabelldefinitioner och data för användning:

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

Om dina värden är kända kommer du att hårdkoda frågan:

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

Se SQL Demo

Om du sedan behöver generera veckonumret dynamiskt kommer din kod att vara:

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

Se SQL Demo.

Den dynamiska versionen genererar listan över week tal som ska konverteras till kolumner. Båda ger samma resultat:

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


  1. Förstå kolumnalias i Select Query i SQL Server - SQL Server / TSQL självstudie del 115

  2. Oracle 12.2 Sharding

  3. Hur kör man SQLite-fråga asynkront på bakgrundstråden?

  4. Vad är SQL Server?