Có thể có nhiều cách tiếp cận khác nhau. Bạn có thể tính toán tất cả các tổng số sau trục, hoặc bạn có thể nhận được tổng số đầu tiên, sau đó xoay vòng tất cả các kết quả. Cũng có thể có loại nền tảng trung bình: có được một loại tổng số (ví dụ như các loại hàng ngang), trục xoay, sau đó lấy loại khác, mặc dù điều đó có thể làm quá mức.
Việc đầu tiên của các phương pháp đã đề cập, nhận được tất cả những tổng số sau khi trục, có thể được thực hiện theo một cách rất đơn giản, và điều duy nhất có khả năng mới cho bạn trong việc thực hiện dưới đây 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, phần GROUP BY ROLLUP()
tạo ra tổng số hàng cho bạn. Việc nhóm đầu tiên được thực hiện bởi environment_name
, sau đó hàng tổng cộng lớn được thêm vào.
Để làm điều ngược lại, tức là lấy tổng số trước pivoting, 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 có thể được kiểm tra và chơi với ít SQL Fiddle:
Lưu ý. Tôi đã bỏ qua bước bỏ phiếu trong cả hai đề xuất vì việc bỏ cấm một cột đơn có vẻ rõ ràng là dư thừa. Tuy nhiên, nếu có nhiều điều hơn, việc điều chỉnh một trong các truy vấn phải dễ dàng.
Chào mừng bạn đến với StackOverflow: nếu bạn đăng mã, XML hoặc mẫu dữ liệu, hãy ** tô sáng những dòng đó trong trình soạn thảo văn bản và nhấp vào nút "mẫu mã" ('{}') trên thanh công cụ của trình soạn thảo để định dạng độc đáo và cú pháp làm nổi bật nó! –
Mục đích của phần 'unpivot' trong truy vấn này là gì? Chắc chắn, bạn có thể thay thế toàn bộ truy vấn phụ chỉ bằng 'select environment_name as" ", root_cause làm giá trị từ test1', không? –
Xin lỗi, tôi có nghĩa là bạn có thể * viết lại * như thế. –