Dans SQL Server 2008, vous pouvez gérer cette tâche assez facilement avec une requête PIVOT. L'exemple suivant repose sur l'obtention de vos données dans le format suivant (ce que vous semblez avoir déjà fait) :
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 vous pouvez le faire, votre requête PIVOT devrait ressembler à ceci :
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]
Dans cet exemple, j'ai utilisé le SUM([Value]) OVER PARTITION
pour obtenir les sommes pour chaque district, puis j'ai fait un UNION pour ajouter une ligne de totaux en bas. Les résultats ressemblent à ceci :
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
Une chose que vous remarquerez à propos de cette approche est que vous devez connaître à l'avance les noms de colonne que vous souhaitez placer en haut du tableau. C'est facile à faire si vous configurez le rapport pour qu'il s'exécute pendant une année complète, mais c'est plus délicat si le nombre de colonnes va changer. Si vous autorisez les utilisateurs à spécifier une plage de dates personnalisée (par exemple, 07/2011-10/2011 ou 06/2011-11/2011), une façon de gérer cette exigence consiste à créer la requête PIVOT à l'aide de SQL dynamique. puis exécutez-le avec sp_executesql .