SQL Server 2008では、PIVOTクエリを使用してこのタスクを非常に簡単に処理できます。次の例は、データを次の形式に変換することに依存しています(すでに行っているように見えます):
Name Month Value
---------- ------- -----
District 1 Month 1 10
District 1 Month 2 5
District 1 Month 3 6
District 2 Month 1 1
District 2 Month 2 2
District 2 Month 3 3
District 3 Month 1 8
District 3 Month 2 6
District 3 Month 3 11
それができる場合、PIVOTクエリは次のようになります。
DECLARE @myTable AS TABLE([Name] VARCHAR(20), [Month] VARCHAR(20), [Value] INT)
INSERT INTO @myTable VALUES ('District 1', 'Month 1', 10)
INSERT INTO @myTable VALUES ('District 1', 'Month 2', 5)
INSERT INTO @myTable VALUES ('District 1', 'Month 3', 6)
INSERT INTO @myTable VALUES ('District 2', 'Month 1', 1)
INSERT INTO @myTable VALUES ('District 2', 'Month 2', 2)
INSERT INTO @myTable VALUES ('District 2', 'Month 3', 3)
INSERT INTO @myTable VALUES ('District 3', 'Month 1', 8)
INSERT INTO @myTable VALUES ('District 3', 'Month 2', 6)
INSERT INTO @myTable VALUES ('District 3', 'Month 3', 11)
SELECT [Name], [Month 1], [Month 2], [Month 3], [NameTotalValue] AS [Total]
FROM
(
SELECT [Name], [Month], [Value],
SUM([Value]) OVER (PARTITION BY [Name]) as [NameTotalValue]
FROM @myTable
UNION
SELECT 'Total', [Month], SUM([Value]), (SELECT SUM([Value]) FROM @myTable)
FROM @myTable
GROUP BY [Month]
) t
PIVOT
(
SUM([Value]) FOR [Month] IN ([Month 1], [Month 2], [Month 3])
) AS pvt
ORDER BY pvt.[Name]
この例では、SUM([Value]) OVER PARTITION
を使用しました 各地区の合計を取得するために、次にUNIONを実行して合計行を下部に追加しました。結果は次のようになります:
Name Month 1 Month 2 Month 3 Total
----------- ------- ------- ------- -----
District 1 10 5 6 21
District 2 1 2 3 6
District 3 8 6 11 25
Total 19 13 20 52
このアプローチについて気付くのは、テーブルの上部に必要な列名を事前に知っておく必要があるということです。レポートを1年間実行するように設定している場合、これは簡単に実行できますが、列の数が変更される場合は注意が必要です。ユーザーがカスタムの日付範囲(つまり、07 / 2011-10/2011または06/2011-11 / 2011)を指定できるようにする場合、その要件を処理する1つの方法は、動的SQLを使用してPIVOTクエリを作成することです。次に、sp_executesql を使用して実行します。 。