Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Voglio un risultato di query selezionato in formato tabulare come un rapporto di riepilogo

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 .