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

Jeg vil have et udvalgt forespørgselsresultat i tabelformat som oversigtsrapport

I SQL Server 2008 kan du håndtere denne opgave ret nemt med en PIVOT-forespørgsel. Følgende eksempel bygger på at få dine data ind i følgende format (hvilket det ser ud til, at du allerede 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

Hvis du kan gøre det, så skulle din PIVOT-forespørgsel se sådan ud:

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 dette eksempel brugte jeg SUM([Value]) OVER PARTITION for at få summen for hvert distrikt, og så lavede jeg en UNION for at tilføje en totalrække til bunden. Resultaterne ser således ud:

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 ting, du vil bemærke ved denne tilgang, er, at du skal kende de kolonnenavne, du vil have øverst i tabellen, på forhånd. Det er nemt at gøre, hvis du konfigurerer rapporten til at køre i et helt år, men det er vanskeligere, hvis antallet af kolonner skal ændre sig. Hvis du vil tillade brugerne at angive et tilpasset datointerval (dvs. 07/2011-10/2011 eller 06/2011-11/2011), så er en måde at håndtere dette krav på at bygge PIVOT-forespørgslen ved hjælp af dynamisk SQL og kør det derefter med sp_executesql .




  1. Kan ikke hente mysql-data (CodeIgniter Selecting)

  2. PHP PDO bindParam for variabel/streng brugt til IN-sætning...?

  3. mysql_query til PDO og forberedte erklæringer

  4. Sådan overføres brugerdefineret type-array til Postgres-funktionen