Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Je veux un résultat de requête de sélection sous forme de tableau comme un rapport de synthèse

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 .