Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Usando tabela dinâmica com totais de coluna e linha no sql server 2008


Pode haver várias abordagens para isso. Você pode calcular todos os totais após o pivô ou pode obter os totais primeiro e depois dinamizar todos os resultados. Também é possível ter um meio-termo:pegue um tipo dos totais (por exemplo, os de linha), pivô e depois pegue o outro tipo, embora isso possa estar exagerando.

A primeira das abordagens mencionadas, obter todos os totais após o pivô, pode ser feita de maneira muito direta, e a única coisa potencialmente nova para você na implementação abaixo pode ser 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)
;

Basicamente, o GROUP BY ROLLUP() parte produz a linha Total para voce. O agrupamento é feito primeiro por environment_name , a linha de total geral é adicionada.

Para fazer exatamente o oposto, ou seja, obter os totais antes de girar, você pode empregar GROUP BY CUBE() assim:
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
;

Ambos os métodos podem ser testados e reproduzidos no SQL Fiddle:

Nota. Eu omiti a etapa de não dinamização em ambas as sugestões porque a não dinamização de uma única coluna parecia claramente redundante. Se houver mais do que isso, ajustar qualquer uma das consultas deve ser fácil.