Om du använder SQL Server 2005+ kan du använda PIVOT
funktion för att omvandla data från rader till kolumner.
Det låter som att du kommer att behöva använda dynamisk sql om veckorna är okända men det är lättare att se rätt kod med en hårdkodad version initialt.
Först och främst, här är några snabba tabelldefinitioner och data för användning:
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);
Om dina värden är kända kommer du att hårdkoda frågan:
select *
from
(
select store, week, xCount
from yt
) src
pivot
(
sum(xcount)
for week in ([1], [2], [3])
) piv;
Se SQL Demo
Om du sedan behöver generera veckonumret dynamiskt kommer din kod att vara:
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);
Se SQL Demo.
Den dynamiska versionen genererar listan över week
tal som ska konverteras till kolumner. Båda ger samma resultat:
| STORE | 1 | 2 | 3 |
---------------------------
| 101 | 138 | 282 | 220 |
| 102 | 96 | 212 | 123 |
| 105 | 37 | 78 | 60 |
| 109 | 59 | 97 | 87 |