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.