In SQL Server 2008 können Sie diese Aufgabe ziemlich einfach mit einer PIVOT-Abfrage erledigen. Das folgende Beispiel basiert darauf, Ihre Daten in das folgende Format zu bringen (was Sie anscheinend bereits getan haben):
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
Wenn Sie das tun können, sollte Ihre PIVOT-Abfrage etwa so aussehen:
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]
In diesem Beispiel habe ich SUM([Value]) OVER PARTITION
verwendet um die Summen für jeden Distrikt zu erhalten, und dann habe ich eine UNION durchgeführt, um unten eine Summenzeile hinzuzufügen. Die Ergebnisse sehen so aus:
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
Eine Sache, die Sie bei diesem Ansatz bemerken werden, ist, dass Sie die Spaltennamen, die Sie oben in der Tabelle haben möchten, im Voraus wissen müssen. Dies ist einfach, wenn Sie den Bericht so einrichten, dass er ein ganzes Jahr lang ausgeführt wird, ist jedoch schwieriger, wenn sich die Anzahl der Spalten ändern wird. Wenn Sie den Benutzern erlauben, einen benutzerdefinierten Datumsbereich anzugeben (d. h. 07/2011-10/2011 oder 06/2011-11/2011), dann besteht eine Möglichkeit, diese Anforderung zu erfüllen, darin, die PIVOT-Abfrage mit dynamischem SQL zu erstellen und dann mit sp_executesql ausführen .