I SQL Server 2008 kan du hantera denna uppgift ganska enkelt med en PIVOT-fråga. Följande exempel bygger på att dina data överförs till följande format (vilket det verkar som om du redan har gjort):
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
Om du kan göra det, bör din PIVOT-fråga se ut ungefär så här:
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]
I det här exemplet använde jag SUM([Value]) OVER PARTITION
för att få summorna för varje distrikt, och sedan gjorde jag en UNION för att lägga till en totalrad längst ner. Resultaten ser ut så här:
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
En sak som du kommer att märka med detta tillvägagångssätt är att du måste känna till kolumnnamnen du vill ha högst upp i tabellen i förväg. Det är lätt att göra om du ställer in rapporten så att den körs under ett helt år, men det är svårare om antalet kolumner ska ändras. Om du ska tillåta användarna att ange ett anpassat datumintervall (d.v.s. 2011-10-07 eller 2011-11-06), är ett sätt att hantera det kravet att bygga PIVOT-frågan med dynamisk SQL och kör det sedan med sp_executesql .