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

Tôi muốn một kết quả truy vấn chọn lọc ở định dạng bảng như báo cáo tóm tắt

Trong SQL Server 2008, bạn có thể xử lý tác vụ này khá dễ dàng với truy vấn PIVOT. Ví dụ sau dựa vào việc đưa dữ liệu của bạn sang định dạng sau (có vẻ như bạn đã làm xong):

Name        Month    Value
----------  -------  -----
District 1  Month 1     10
District 1  Month 2      5
District 1  Month 3      6
District 2  Month 1      1
District 2  Month 2      2
District 2  Month 3      3
District 3  Month 1      8
District 3  Month 2      6
District 3  Month 3     11

Nếu bạn có thể làm điều đó, thì truy vấn PIVOT của bạn sẽ trông giống như sau:

DECLARE @myTable AS TABLE([Name] VARCHAR(20), [Month] VARCHAR(20), [Value] INT)
INSERT INTO @myTable VALUES ('District 1', 'Month 1', 10)
INSERT INTO @myTable VALUES ('District 1', 'Month 2', 5)
INSERT INTO @myTable VALUES ('District 1', 'Month 3', 6)
INSERT INTO @myTable VALUES ('District 2', 'Month 1', 1)
INSERT INTO @myTable VALUES ('District 2', 'Month 2', 2)
INSERT INTO @myTable VALUES ('District 2', 'Month 3', 3)
INSERT INTO @myTable VALUES ('District 3', 'Month 1', 8)
INSERT INTO @myTable VALUES ('District 3', 'Month 2', 6)
INSERT INTO @myTable VALUES ('District 3', 'Month 3', 11)

SELECT [Name], [Month 1], [Month 2], [Month 3], [NameTotalValue] AS [Total]
FROM
(
      SELECT [Name], [Month], [Value], 
             SUM([Value]) OVER (PARTITION BY [Name]) as [NameTotalValue] 
      FROM @myTable
    UNION 
      SELECT 'Total', [Month], SUM([Value]), (SELECT SUM([Value]) FROM @myTable)
      FROM @myTable
      GROUP BY [Month]
) t
PIVOT
(
    SUM([Value]) FOR [Month] IN ([Month 1], [Month 2], [Month 3]) 
) AS pvt
ORDER BY pvt.[Name]

Trong ví dụ này, tôi đã sử dụng SUM([Value]) OVER PARTITION để lấy tổng cho mỗi Quận, và sau đó tôi đã thực hiện một UNION để thêm một hàng tổng vào dưới cùng. Kết quả như sau:

Name        Month 1 Month 2 Month 3 Total
----------- ------- ------- ------- -----
District 1       10       5       6    21
District 2        1       2       3     6
District 3        8       6      11    25
Total            19      13      20    52

Một điều bạn sẽ nhận thấy về cách tiếp cận này là bạn phải biết trước các tên cột bạn muốn ở đầu bảng. Điều đó dễ thực hiện nếu bạn đang thiết lập báo cáo để chạy trong cả năm, nhưng sẽ phức tạp hơn nếu số lượng cột thay đổi. Nếu bạn định cho phép người dùng chỉ định phạm vi ngày tùy chỉnh (tức là 07 / 2011-10 / 2011 hoặc 06 / 2011-11 / 2011), thì một cách xử lý yêu cầu đó là tạo truy vấn PIVOT bằng cách sử dụng SQL động và sau đó thực thi nó với sp_executesql .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lỗi tên cột không rõ ràng

  2. Lỗi SQL Server trên lệnh cập nhật - Đã xảy ra lỗi nghiêm trọng trên lệnh hiện tại

  3. SQL Server 2008 Express CONCAT () không tồn tại?

  4. Datetime2 là gì?

  5. Làm cách nào để kiểm tra trạng thái sao chép SQL qua T-SQL?