In SQL Server 2008 kun je deze taak vrij eenvoudig afhandelen met een PIVOT-query. Het volgende voorbeeld is gebaseerd op het krijgen van uw gegevens in de volgende indeling (het lijkt erop dat u dit al hebt gedaan):
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
Als je dat kunt doen, dan zou je PIVOT-query er ongeveer zo uit moeten zien:
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]
In dit voorbeeld gebruikte ik de SUM([Value]) OVER PARTITION
om de sommen voor elk district te krijgen, en toen deed ik een UNIE om onderaan een rij met totalen toe te voegen. De resultaten zien er als volgt uit:
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
Een ding dat je opvalt aan deze aanpak is dat je van tevoren moet weten welke kolomnamen je bovenaan de tabel wilt hebben. Dat is gemakkelijk te doen als u het rapport instelt voor een heel jaar, maar het is lastiger als het aantal kolommen gaat veranderen. Als u de gebruikers toestaat om een aangepast datumbereik op te geven (d.w.z. 07/2011-10/2011 of 06/2011-11/2011), dan is een manier om die vereiste aan te pakken de PIVOT-query te bouwen met behulp van dynamische SQL en voer het vervolgens uit met sp_executesql .