sql >> Database >  >> RDS >> Sqlserver

Converteer rijen naar kolommen met 'Pivot' in SQL Server

Als u SQL Server 2005+ gebruikt, kunt u de PIVOT . gebruiken functie om de gegevens van rijen in kolommen om te zetten.

Het klinkt alsof je dynamische sql moet gebruiken als de weken onbekend zijn, maar het is in eerste instantie gemakkelijker om de juiste code te zien met een hard-coded versie.

Om te beginnen volgen hier enkele snelle tabeldefinities en gegevens voor gebruik:

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

Als uw waarden bekend zijn, dan zal u de query hard coderen:

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

Zie SQL-demo

Als u het weeknummer vervolgens dynamisch moet genereren, is uw 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);

Zie SQL-demo.

De dynamische versie genereert de lijst van week getallen die naar kolommen moeten worden geconverteerd. Beide geven hetzelfde resultaat:

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


  1. Array doorgeven aan Oracle-procedure vanuit c#

  2. Hoe SQL-afstemming in Oracle te doen?

  3. Parallelle unnest() en sorteervolgorde in PostgreSQL

  4. Is Microsoft Access nog steeds relevant in 2020?