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 |