sql >> Databáze >  >> RDS >> Sqlserver

Chci výsledek výběrového dotazu v tabulkovém formátu, jako je souhrnná zpráva

V SQL Server 2008 můžete tento úkol zvládnout docela snadno pomocí PIVOT dotazu. Následující příklad se opírá o převedení vašich dat do následujícího formátu (což vypadá, že jste to již udělali):

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

Pokud to dokážete, váš PIVOT dotaz by měl vypadat nějak takto:

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]

V tomto příkladu jsem použil SUM([Value]) OVER PARTITION abych získal součty pro každý okres, a pak jsem provedl UNION, abych na konec přidal řádek součtů. Výsledky vypadají takto:

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

Jedna věc, které si u tohoto přístupu všimnete, je, že musíte předem znát názvy sloupců, které chcete mít nahoře v tabulce. To je snadné, pokud nastavujete přehled tak, aby se spouštěl celý rok, ale je to složitější, pokud se má změnit počet sloupců. Pokud chcete uživatelům umožnit zadat vlastní časové období (tj. 07/2011-10/2011 nebo 06/2011-11/2011), pak jedním ze způsobů, jak tento požadavek zvládnout, je vytvořit PIVOT dotaz pomocí dynamického SQL a poté jej spusťte pomocí sp_executesql .




  1. Rychlé obnovení materializovaného pohledu pomocí klauzule HAVING?

  2. Nejlepší způsob, jak skartovat data XML do databázových sloupců SQL Server

  3. Najděte nejlépe odpovídající řádek v MySQL (InnoDB)

  4. odstranění dalších znaků před vložením dat do MYSQL?