Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Ich möchte ein ausgewähltes Abfrageergebnis im Tabellenformat wie einen zusammenfassenden Bericht

In SQL Server 2008 können Sie diese Aufgabe ziemlich einfach mit einer PIVOT-Abfrage erledigen. Das folgende Beispiel basiert darauf, Ihre Daten in das folgende Format zu bringen (was Sie anscheinend bereits getan haben):

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

Wenn Sie das tun können, sollte Ihre PIVOT-Abfrage etwa so aussehen:

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 diesem Beispiel habe ich SUM([Value]) OVER PARTITION verwendet um die Summen für jeden Distrikt zu erhalten, und dann habe ich eine UNION durchgeführt, um unten eine Summenzeile hinzuzufügen. Die Ergebnisse sehen so aus:

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

Eine Sache, die Sie bei diesem Ansatz bemerken werden, ist, dass Sie die Spaltennamen, die Sie oben in der Tabelle haben möchten, im Voraus wissen müssen. Dies ist einfach, wenn Sie den Bericht so einrichten, dass er ein ganzes Jahr lang ausgeführt wird, ist jedoch schwieriger, wenn sich die Anzahl der Spalten ändern wird. Wenn Sie den Benutzern erlauben, einen benutzerdefinierten Datumsbereich anzugeben (d. h. 07/2011-10/2011 oder 06/2011-11/2011), dann besteht eine Möglichkeit, diese Anforderung zu erfüllen, darin, die PIVOT-Abfrage mit dynamischem SQL zu erstellen und dann mit sp_executesql ausführen .