Wenn Sie SQL Server 2005+ verwenden, können Sie den PIVOT
verwenden Funktion, um die Daten von Zeilen in Spalten umzuwandeln.
Es hört sich so an, als müssten Sie dynamisches SQL verwenden, wenn die Wochen unbekannt sind, aber es ist einfacher, den richtigen Code zu sehen, wenn Sie zunächst eine fest codierte Version verwenden.
Hier sind zunächst einige schnelle Tabellendefinitionen und Daten zur Verwendung:
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);
Wenn Ihre Werte bekannt sind, werden Sie die Abfrage fest codieren:
select *
from
(
select store, week, xCount
from yt
) src
pivot
(
sum(xcount)
for week in ([1], [2], [3])
) piv;
Siehe SQL-Demo
Wenn Sie dann die Wochennummer dynamisch generieren müssen, lautet Ihr 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);
Siehe SQL-Demo.
Die dynamische Version generiert die Liste der week
Zahlen, die in Spalten umgewandelt werden sollen. Beide geben das gleiche Ergebnis:
| STORE | 1 | 2 | 3 |
---------------------------
| 101 | 138 | 282 | 220 |
| 102 | 96 | 212 | 123 |
| 105 | 37 | 78 | 60 |
| 109 | 59 | 97 | 87 |