Di SQL Server 2008 Anda dapat menangani tugas ini dengan cukup mudah dengan kueri PIVOT. Contoh berikut bergantung pada memasukkan data Anda ke dalam format berikut (yang sepertinya sudah Anda lakukan):
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
Jika Anda dapat melakukannya, kueri PIVOT Anda akan terlihat seperti ini:
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]
Dalam contoh ini, saya menggunakan SUM([Value]) OVER PARTITION
untuk mendapatkan jumlah untuk setiap Distrik, dan kemudian saya melakukan UNION untuk menambahkan baris total ke bawah. Hasilnya terlihat seperti ini:
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
Satu hal yang akan Anda perhatikan tentang pendekatan ini adalah Anda harus mengetahui nama kolom yang Anda inginkan di bagian atas tabel sebelumnya. Itu mudah dilakukan jika Anda menyiapkan laporan untuk berjalan selama setahun penuh, tetapi lebih sulit jika jumlah kolom akan berubah. Jika Anda akan mengizinkan pengguna untuk menentukan rentang tanggal khusus (yaitu, 07/2011-10/2011 atau 06/2011-11/2011), maka salah satu cara menangani persyaratan itu adalah dengan membuat kueri PIVOT menggunakan SQL dinamis lalu jalankan dengan sp_executesql .