sql >> Database >  >> RDS >> Sqlserver

Draaitabel gebruiken met kolom- en rijtotalen in SQL Server 2008

Hier kunnen verschillende benaderingen voor zijn. U kunt alle totalen na de pivot berekenen, of u kunt eerst de totalen krijgen en vervolgens alle resultaten draaien. Het is ook mogelijk om een ​​soort middenweg te hebben:pak de ene soort van de totalen (bijvoorbeeld de rijgewijze), draai dan de andere soort, hoewel dat misschien overdreven is.

De eerste van de genoemde benaderingen, het verkrijgen van alle totalen na de spil, zou op een zeer eenvoudige manier kunnen worden gedaan, en het enige dat mogelijk nieuw voor u is in de onderstaande implementatie is misschien GROUP BY ROLLUP() :

SELECT
  [ ]      = ISNULL(environment_name, 'Total'),
  [Enviro] = SUM([Enviro]),
  [Requi]  = SUM([Requi]),
  [Dev]    = SUM([Dev]),
  [Tsc]    = SUM([Tsc]),
  [TD]     = SUM([TD]),
  [Unkn]   = SUM([Unkn]),
  Total    = SUM([Enviro] + [Requi] + [Dev] + [Tsc] + [TD] + [Unkn])
FROM (
  SELECT environment_name, root_cause
  FROM test1
) s
PIVOT (
  COUNT(root_cause)
  FOR root_cause IN ([Enviro], [Requi], [Dev], [Tsc], [TD], [Unkn])
) p
GROUP BY
  ROLLUP(environment_name)
;

Kortom, de GROUP BY ROLLUP() part produceert de Total rij voor jou. De groepering wordt eerst gedaan door environment_name , dan wordt de eindtotaalrij toegevoegd.

Om precies het tegenovergestelde te doen, d.w.z. de totalen te krijgen voordat u draait, kunt u GROUP BY CUBE() gebruiken zoals dit:

SELECT
  [ ]      = environment_name,
  [Enviro] = ISNULL([Enviro], 0),
  [Requi]  = ISNULL([Requi] , 0),
  [Dev]    = ISNULL([Dev]   , 0),
  [Tsc]    = ISNULL([Tsc]   , 0),
  [TD]     = ISNULL([TD]    , 0),
  [Unkn]   = ISNULL([Unkn]  , 0),
  Total    = ISNULL(Total   , 0)
FROM (
  SELECT
    environment_name = ISNULL(environment_name, 'Total'),
    root_cause       = ISNULL(root_cause,       'Total'),
    cnt              = COUNT(*)
  FROM test1
  WHERE root_cause IS NOT NULL
  GROUP BY
    CUBE(environment_name, root_cause)
) s
PIVOT (
  SUM(cnt)
  FOR root_cause IN ([Enviro], [Requi], [Dev], [Tsc], [TD], [Unkn], Total)
) p
;

Beide methoden kunnen worden getest en gespeeld bij SQL Fiddle:

Opmerking. Ik heb de ondraaibare stap in beide suggesties weggelaten omdat het ongedaan maken van een enkele kolom duidelijk overbodig leek. Als er echter meer aan de hand is, zou het aanpassen van een van de zoekopdrachten eenvoudig moeten zijn.



  1. Hoe 0 te tonen als er geen gegevens zijn

  2. Leer hoe je formulieren in het geheugen kunt spawnen (ja, dat heb je goed gehoord)

  3. Oracle-nummer en varchar-join

  4. Is SQLFiddle kapot? Fouten voor Oracle, SQL Server, ...?