Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Sử dụng bảng tổng hợp với tổng số cột và hàng trong sql server 2008

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Xóa một lượng lớn dữ liệu khỏi SQL Server 2008

  2. Tạm dừng sao chép máy chủ SQL

  3. Hiểu kích thước bộ nhớ ‘datetime2’ trong SQL Server

  4. Làm thế nào để chạy một chương trình từ SQL?

  5. Điều gì làm cho một câu lệnh SQL có thể phân loại được?