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

Konverter rækker til kolonner ved hjælp af 'Pivot' i SQL Server

Hvis du bruger SQL Server 2005+, kan du bruge PIVOT funktion til at transformere data fra rækker til kolonner.

Det lyder som om du bliver nødt til at bruge dynamisk sql, hvis ugerne er ukendte, men det er nemmere at se den korrekte kode ved at bruge en hårdkodet version til at begynde med.

Først og fremmest er her nogle hurtige tabeldefinitioner og data til brug:

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

Hvis dine værdier er kendte, vil du hårdkode forespørgslen:

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

Se SQL Demo

Så hvis du har brug for at generere ugenummeret dynamisk, vil din kode være:

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 dynamiske version genererer listen over week tal, der skal konverteres til kolonner. Begge giver det samme resultat:

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

  1. Hvordan bruger jeg korrekt CASE..WHEN i MySQL

  2. Sådan får du vist flere forespørgsler og resultater side om side i SQL Server Management Studio (SSMS) - SQL Server / TSQL vejledning del 14

  3. At spise vores eget hundefoder – Kører JIRA på MariaDB

  4. Del forbindelse til postgres db på tværs af processer i Python