Der kan være forskellige tilgange til dette. Du kan beregne alle totalerne efter pivoten, eller du kan få totalerne først og derefter pivotere alle resultaterne. Det er også muligt at have en slags mellemvej:få en slags totaler (f.eks. rækkevis), drej og få den anden slags, selvom det måske er at overdrive det.
Den første af de nævnte tilgange, at få alle totalerne efter pivoten, kunne gøres på en meget ligetil måde, og det eneste potentielt nye for dig i nedenstående implementering kan være 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)
;
Grundlæggende er GROUP BY ROLLUP()
del producerer total rækken for dig. Grupperingen udføres først af environment_name
, så tilføjes den samlede række.
For at gøre det modsatte, dvs. få totalerne før pivotering, kan du bruge GROUP BY CUBE()
sådan her:
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
;
Begge metoder kan testes og spilles med på SQL Fiddle:
Bemærk. Jeg har udeladt unpivoting-trinnet i begge forslag, fordi unpivotering af en enkelt kolonne virkede klart overflødig. Hvis der er mere i det, bør det dog være nemt at justere en af forespørgslerne.