sql >> Database >  >> RDS >> Sqlserver

Ik wil een selectiequeryresultaat in tabelvorm zoals een samenvattingsrapport

In SQL Server 2008 kun je deze taak vrij eenvoudig afhandelen met een PIVOT-query. Het volgende voorbeeld is gebaseerd op het krijgen van uw gegevens in de volgende indeling (het lijkt erop dat u dit al hebt gedaan):

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

Als je dat kunt doen, dan zou je PIVOT-query er ongeveer zo uit moeten zien:

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 dit voorbeeld gebruikte ik de SUM([Value]) OVER PARTITION om de sommen voor elk district te krijgen, en toen deed ik een UNIE om onderaan een rij met totalen toe te voegen. De resultaten zien er als volgt uit:

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

Een ding dat je opvalt aan deze aanpak is dat je van tevoren moet weten welke kolomnamen je bovenaan de tabel wilt hebben. Dat is gemakkelijk te doen als u het rapport instelt voor een heel jaar, maar het is lastiger als het aantal kolommen gaat veranderen. Als u de gebruikers toestaat om een ​​aangepast datumbereik op te geven (d.w.z. 07/2011-10/2011 of 06/2011-11/2011), dan is een manier om die vereiste aan te pakken de PIVOT-query te bouwen met behulp van dynamische SQL en voer het vervolgens uit met sp_executesql .




  1. sql zoeken vanuit csv-tekenreeks

  2. NLS_DATE_FORMAT met JDBC

  3. Hoe de if/else-voorwaarde te gebruiken in een select in mysql

  4. hoe de kolom in de 'where'-clausule te vermijden als de parameter 'NOT PASSED' is postgresql