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 .