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 |