Có thể có nhiều cách tiếp cận khác nhau để giải quyết vấn đề này. Bạn có thể tính tất cả các tổng sau khi xoay vòng hoặc bạn có thể lấy tổng trước, sau đó xoay tất cả các kết quả. Cũng có thể có một loại điểm trung gian:lấy một loại trong tổng số (ví dụ:tổng số theo hàng), xoay vòng, sau đó lấy loại khác, mặc dù điều đó có thể làm quá mức.
Cách tiếp cận đầu tiên trong số các cách tiếp cận được đề cập, lấy tất cả các tổng sau trục xoay, có thể được thực hiện một cách rất đơn giản và điều duy nhất có thể mới đối với bạn trong cách triển khai bên dưới có thể là 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ề cơ bản, GROUP BY ROLLUP()
phần tạo ra Tổng số hàng cho bạn. Việc nhóm được thực hiện đầu tiên bởi environment_name
, sau đó hàng tổng lớn được thêm vào.
Để làm ngược lại, tức là lấy tổng số trước khi xoay vòng, bạn có thể sử dụng GROUP BY CUBE()
như thế này:
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
;
Cả hai phương pháp đều có thể được kiểm tra và chơi với SQL Fiddle:
Lưu ý. Tôi đã bỏ qua bước bỏ chia sẻ trong cả hai đề xuất vì việc bỏ chia nhỏ một cột rõ ràng là thừa. Tuy nhiên, nếu có nhiều thứ hơn, việc điều chỉnh một trong hai truy vấn sẽ dễ dàng.