Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Convertir des lignes en colonnes à l'aide de 'Pivot' dans SQL Server

Si vous utilisez SQL Server 2005+, vous pouvez utiliser le PIVOT fonction pour transformer les données des lignes en colonnes.

Il semble que vous devrez utiliser SQL dynamique si les semaines sont inconnues, mais il est plus facile de voir le code correct en utilisant initialement une version codée en dur.

Tout d'abord, voici quelques définitions de tableau rapides et des données à utiliser :

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

Si vos valeurs sont connues, vous allez coder en dur la requête :

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

Voir la démo SQL

Ensuite, si vous avez besoin de générer dynamiquement le numéro de semaine, votre code sera :

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

Voir Démo SQL.

La version dynamique, génère la liste des week nombres qui doivent être convertis en colonnes. Les deux donnent le même résultat :

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