In SQL Server 2008 puoi gestire questa attività abbastanza facilmente con una query PIVOT. L'esempio seguente si basa sull'acquisizione dei dati nel formato seguente (cosa che sembra che tu abbia già fatto):
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
Se puoi farlo, la tua query PIVOT dovrebbe assomigliare a questa:
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 questo esempio, ho usato SUM([Value]) OVER PARTITION
per ottenere le somme per ogni Distretto, e poi ho fatto un'UNIONE per aggiungere una riga di totali in fondo. I risultati si presentano così:
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
Una cosa che noterai di questo approccio è che devi conoscere in anticipo i nomi delle colonne che desideri nella parte superiore della tabella. È facile se stai impostando il rapporto per l'esecuzione per un anno intero, ma è più complicato se il numero di colonne cambierà. Se intendi consentire agli utenti di specificare un intervallo di date personalizzato (ad es. 07/2011-10/2011 o 06/2011-11/2011), un modo per gestire tale requisito è creare la query PIVOT utilizzando SQL dinamico quindi eseguilo con sp_executesql .