MS ピボット テーブルに関する情報を読みましたが、まだ正しく理解できていません。
作成中の一時テーブルがあり、列 1 は店舗番号、列 2 は週番号、列 3 は何らかの合計であるとします。また、週番号は動的ですが、店舗番号は静的です。
Store Week xCount
------- ---- ------
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
次のようにピボット テーブルとして出力したいと思います。
Store 1 2 3 4 5 6....
-----
101 138 282 220
102 96 212 123
105 37
109
横に数字を、上部に週数を格納します。
ベストアンサー1
PIVOT
SQL Server 2005 以降を使用している場合は、関数を使用してデータを行から列に変換できます。
週が不明な場合は動的 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 |