En SQL Server 2008, puede manejar esta tarea con bastante facilidad con una consulta PIVOT. El siguiente ejemplo se basa en obtener sus datos en el siguiente formato (que parece que ya lo ha hecho):
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
Si puede hacer eso, entonces su consulta PIVOT debería verse así:
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]
En este ejemplo, utilicé SUM([Value]) OVER PARTITION
para obtener las sumas de cada Distrito, y luego hice una UNIÓN para agregar una fila de totales al final. Los resultados se ven así:
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 que notará sobre este enfoque es que debe saber los nombres de las columnas que desea en la parte superior de la tabla con anticipación. Eso es fácil de hacer si está configurando el informe para que se ejecute durante un año completo, pero es más complicado si la cantidad de columnas va a cambiar. Si va a permitir que los usuarios especifiquen un rango de fechas personalizado (es decir, 07/2011-10/2011 o 06/2011-11/2011), entonces una forma de manejar ese requisito es construir la consulta PIVOT usando SQL dinámico y luego ejecútelo con sp_executesql .