В SQL Server 2008 вы можете довольно легко справиться с этой задачей с помощью запроса PIVOT.Следующий пример основан на получении ваших данных в следующем формате (который выглядит так, как будто вы уже сделали):
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
Если вы можете сделать это, тогда ваш запрос PIVOT должен выглядеть примерно так:
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]
В этом примере я использовал SUM([Value]) OVER PARTITION
, чтобы получить суммы для каждого округа, а затем я сделал UNION, чтобы добавить итоговую строку в конец.Результаты выглядят следующим образом:
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
Одна вещь, которую вы заметите в этом подходе, заключается в том, что вам нужно заранее знать имена столбцов, которые вы хотите расположить вверху таблицы.Это легко сделать, если вы настраиваете отчет на полный год, но сложнее, если количество столбцов изменится.Если вы собираетесь разрешить пользователям указывать пользовательский диапазон дат (например, 07 / 2011-10 / 2011 или 06 / 2011-11 / 2011), то одним из способов справиться с этим требованием является построение запроса PIVOT с использованием динамического SQLи затем выполните его с помощью sp_executesql .