このタイプのデータ変換は、として知られていPIVOT
ます。この操作を実行する方法はいくつかあります。この関数を使用することも、次のステートメントPIVOT
で集計関数を使用することもできます。CASE
静的ピボットバージョン:ここで、すべての値をクエリにハードコーディングします
select ItemCode, [2011], [2012]
from
(
SELECT ItemCode,
QUANTITY,
YEAR(DocDate) Year
FROM MyTable
) src
pivot
(
sum(quantity)
for year in ([2011], [2012])
) piv
SQL FiddlewithDemoを参照してください
骨材の場合:
SELECT ItemCode,
SUM(CASE WHEN YEAR(DocDate) = 2011 THEN QUANTITY ELSE 0 END) AS '2011',
SUM(CASE WHEN YEAR(DocDate) = 2012 THEN QUANTITY ELSE 0 END) AS '2012'
FROM MyTable
GROUP BY ItemCode;
SQL FiddlewithDemoを参照してください
動的ピボット:前の2つのバージョンは、year
変換する値の数がわかっている場合はうまく機能しますが、数が不明な場合は、動的SQLを使用できます。
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(YEAR(DocDate))
from mytable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT itemcode, ' + @cols + ' from
(
select itemcode, quantity, year(docdate) year
from mytable
) x
pivot
(
sum(quantity)
for year in (' + @cols + ')
) p '
execute(@query)
SQL FiddlewithDemoを参照してください
3つのバージョンすべてで同じ結果が得られます。
| ITEMCODE | 2011 | 2012 |
--------------------------
| 1 | 200 | 45 |
| 2 | 89 | 0 |
| 3 | 0 | 7 |