SQL Server 2005以降を使用している場合は、PIVOT
を使用できます。 データを行から列に変換する関数。
週が不明な場合は動的SQLを使用する必要があるようですが、最初にハードコードされたバージョンを使用すると正しいコードを確認する方が簡単です。
まず、使用するための簡単なテーブル定義とデータを次に示します。
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);
値がわかっている場合は、クエリをハードコーディングします:
select *
from
(
select store, week, xCount
from yt
) src
pivot
(
sum(xcount)
for week in ([1], [2], [3])
) piv;
SQLデモを参照
次に、週番号を動的に生成する必要がある場合、コードは次のようになります。
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);
SQLデモを参照してください。
動的バージョンは、week
のリストを生成します 列に変換する必要のある数値。どちらも同じ結果になります:
| STORE | 1 | 2 | 3 |
---------------------------
| 101 | 138 | 282 | 220 |
| 102 | 96 | 212 | 123 |
| 105 | 37 | 78 | 60 |
| 109 | 59 | 97 | 87 |