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

Použití kontingenční tabulky se součty sloupců a řádků na serveru SQL Server 2008

K tomu mohou být různé přístupy. Můžete vypočítat všechny součty po pivotování, nebo můžete nejprve získat součty a poté pivotovat všechny výsledky. Je také možné mít jakousi střední cestu:získat jeden druh součtů (např. řádkové), pivotovat a pak získat druhý druh, i když to může být přehnané.

První ze zmíněných přístupů, získání všech součtů po pivotu, by mohl být proveden velmi přímočarým způsobem a jediná věc, která je pro vás v níže uvedené implementaci potenciálně nová, může být 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)
;

V podstatě GROUP BY ROLLUP() část vytvoří řádek Celkem pro tebe. Seskupení nejprve provede environment_name , pak se přidá řádek celkového součtu.

Chcete-li udělat pravý opak, tj. získat součty před otočením, můžete použít GROUP BY CUBE() takhle:

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
;

Obě metody lze testovat a hrát si s nimi na SQL Fiddle:

Poznámka. V obou návrzích jsem vynechal krok unpivoting, protože unpivoting jednoho sloupce se zdálo být zjevně nadbytečné. Pokud je toho však více, úprava kteréhokoli z dotazů by měla být snadná.



  1. proč toto levé spojení vrací pouze jeden záznam?

  2. SQL příkaz založený na PHP strstr nebo LIKE

  3. V kolika jazycích se Null nerovná ničemu, dokonce ani Null?

  4. Automatické škálování s Amazon Aurora Serverless