Pokud používáte SQL Server 2005+, můžete použít PIVOT
funkce pro transformaci dat z řádků do sloupců.
Zdá se, že budete muset použít dynamický sql, pokud týdny nejsou známy, ale je snazší vidět správný kód zpočátku pomocí pevně zakódované verze.
Nejprve je zde několik rychlých definic tabulek a dat k použití:
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);
Pokud jsou vaše hodnoty známé, pak dotaz napevno zakódujete:
select *
from
(
select store, week, xCount
from yt
) src
pivot
(
sum(xcount)
for week in ([1], [2], [3])
) piv;
Viz SQL Demo
Pokud pak potřebujete vygenerovat číslo týdne dynamicky, váš kód bude:
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);
Viz ukázka SQL.
Dynamická verze generuje seznam week
čísla, která by měla být převedena na sloupce. Oba dávají stejný výsledek:
| STORE | 1 | 2 | 3 |
---------------------------
| 101 | 138 | 282 | 220 |
| 102 | 96 | 212 | 123 |
| 105 | 37 | 78 | 60 |
| 109 | 59 | 97 | 87 |