W SQL Server 2008 możesz łatwo poradzić sobie z tym zadaniem za pomocą zapytania PIVOT. Poniższy przykład polega na pobraniu danych w następującym formacie (co wygląda na to, że już to zrobiłeś):
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
Jeśli możesz to zrobić, twoje zapytanie PIVOT powinno wyglądać mniej więcej tak:
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]
W tym przykładzie użyłem SUM([Value]) OVER PARTITION
aby uzyskać sumy dla każdego dystryktu, a następnie zrobiłem UNION, aby dodać wiersz sum na dole. Wyniki wyglądają tak:
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
Jedną z rzeczy, które zauważysz w tym podejściu, jest to, że musisz znać nazwy kolumn, które chcesz umieścić na górze tabeli. Jest to łatwe, jeśli konfigurujesz raport tak, aby był generowany przez cały rok, ale jest trudniejsze, jeśli zmieni się liczba kolumn. Jeśli zamierzasz zezwolić użytkownikom na określenie niestandardowego zakresu dat (np. 07/2011-10/2011 lub 06/2011-11/2011), to jednym ze sposobów obsłużenia tego wymagania jest zbudowanie zapytania PIVOT przy użyciu dynamicznego SQL a następnie uruchom go za pomocą sp_executesql .