Jeśli używasz SQL Server 2005+, możesz użyć PIVOT
funkcja przekształcania danych z wierszy w kolumny.
Wygląda na to, że będziesz musiał użyć dynamicznego sql, jeśli tygodnie są nieznane, ale łatwiej jest zobaczyć poprawny kod, używając na początku wersji zakodowanej na sztywno.
Po pierwsze, oto kilka szybkich definicji tabel i danych do wykorzystania:
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);
Jeśli Twoje wartości są znane, zakodujesz zapytanie:
select *
from
(
select store, week, xCount
from yt
) src
pivot
(
sum(xcount)
for week in ([1], [2], [3])
) piv;
Zobacz demonstrację SQL
Jeśli potrzebujesz dynamicznie wygenerować numer tygodnia, Twój kod będzie wyglądał następująco:
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);
Zobacz demonstrację SQL.
Wersja dynamiczna generuje listę week
liczby, które należy przekonwertować na kolumny. Oba dają ten sam wynik:
| STORE | 1 | 2 | 3 |
---------------------------
| 101 | 138 | 282 | 220 |
| 102 | 96 | 212 | 123 |
| 105 | 37 | 78 | 60 |
| 109 | 59 | 97 | 87 |