sql >> Databasteknik >  >> RDS >> Sqlserver

Jag vill ha ett utvalt frågeresultat i tabellformat som en sammanfattningsrapport

I SQL Server 2008 kan du hantera denna uppgift ganska enkelt med en PIVOT-fråga. Följande exempel bygger på att dina data överförs till följande format (vilket det verkar som om du redan har gjort):

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

Om du kan göra det, bör din PIVOT-fråga se ut ungefär så här:

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]

I det här exemplet använde jag SUM([Value]) OVER PARTITION för att få summorna för varje distrikt, och sedan gjorde jag en UNION för att lägga till en totalrad längst ner. Resultaten ser ut så här:

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

En sak som du kommer att märka med detta tillvägagångssätt är att du måste känna till kolumnnamnen du vill ha högst upp i tabellen i förväg. Det är lätt att göra om du ställer in rapporten så att den körs under ett helt år, men det är svårare om antalet kolumner ska ändras. Om du ska tillåta användarna att ange ett anpassat datumintervall (d.v.s. 2011-10-07 eller 2011-11-06), är ett sätt att hantera det kravet att bygga PIVOT-frågan med dynamisk SQL och kör det sedan med sp_executesql .




  1. Underfråga med LIMIT i Doctrine

  2. Oracle SQL - Rund - Halv

  3. förenkla SQL-satsen genom att använda CTE

  4. Oracle- Delad sträng kommaavgränsad (sträng innehåller mellanslag och på varandra följande kommatecken)