Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Korzystanie z tabeli przestawnej z sumami kolumn i wierszy w serwerze sql 2008

Mogą być do tego różne podejścia. Możesz obliczyć wszystkie sumy po przestawieniu lub możesz najpierw uzyskać sumy, a następnie przestawić wszystkie wyniki. Możliwe jest również uzyskanie pewnego rodzaju pośredniego punktu:zdobądź jeden rodzaj sum (np. rzędów), przestaw, a następnie zdobądź drugi rodzaj, chociaż może to być przesada.

Pierwsze ze wspomnianych podejść, uzyskanie wszystkich sum po osi obrotu, może być wykonane w bardzo prosty sposób, a jedyną potencjalnie nową rzeczą w poniższej implementacji może być 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)
;

Zasadniczo GROUP BY ROLLUP() część tworzy sumę wiersza dla Was. Grupowanie jest najpierw wykonywane przez environment_name , a następnie dodawany jest wiersz sumy całkowitej.

Aby zrobić dokładnie odwrotnie, tj. uzyskać sumy przed przestawieniem, możesz użyć GROUP BY CUBE() tak:

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
;

Obie metody można przetestować i bawić się nimi w SQL Fiddle:

Uwaga. W obu sugestiach pominąłem krok cofania obrotu, ponieważ cofanie jednej kolumny wydawało się wyraźnie zbędne. Jeśli jednak jest tego więcej, dostosowanie któregokolwiek z zapytań powinno być łatwe.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Porzucanie nienazwanych ograniczeń

  2. Zaktualizuj te same dane z tej samej tabeli

  3. Użyj instrukcji Create, aby utworzyć tabelę w SQL Server — SQL Server / T-SQL Tutorial, część 34

  4. Zdalne połączenie z bazą danych otwarte przez długi czas

  5. Zaktualizuj oświadczenie dla wielu identyfikatorów