Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verwendung einer Pivot-Tabelle mit Spalten- und Zeilensummen in SQL Server 2008

Dabei kann es verschiedene Ansätze geben. Sie können alle Summen nach dem Pivot berechnen oder zuerst die Summen abrufen und dann alle Ergebnisse pivotieren. Es ist auch möglich, eine Art Mittelweg zu finden:eine Art der Summen erhalten (z. B. die zeilenweisen), Pivot, dann die andere Art, obwohl das vielleicht übertrieben ist.

Der erste der erwähnten Ansätze, alle Summen nach dem Pivot zu erhalten, könnte auf sehr einfache Weise durchgeführt werden, und das einzige, was möglicherweise neu für Sie in der folgenden Implementierung ist, könnte 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)
;

Grundsätzlich das GROUP BY ROLLUP() Teil erzeugt die Gesamt-Zeile für dich. Die Gruppierung erfolgt zunächst nach environment_name , dann wird die Gesamtsummenzeile hinzugefügt.

Um genau das Gegenteil zu tun, d. h. die Summen vor dem Pivotieren zu erhalten, könnten Sie GROUP BY CUBE() verwenden so:

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 können bei SQL Fiddle getestet und gespielt werden:

Hinweis. Ich habe den Entpivoting-Schritt in beiden Vorschlägen weggelassen, da das Entpivotieren einer einzelnen Spalte eindeutig überflüssig erschien. Wenn jedoch mehr dahintersteckt, sollte es einfach sein, eine der Abfragen anzupassen.