動的 SQL を使用して列を動的に作成できますが、SSRS や Excel など、動的ピボット用に設計されたレイヤーで動的ピボットを処理することを強くお勧めします。
DECLARE @SQL NVARCHAR(MAX) = '',
@SQL2 NVARCHAR(MAX) = '',
@SQL3 NVARCHAR(MAX) = '';
-- COMPILE THE UNIQUE VALUES FOR ARRIVAL THAT NEED TO BE PIVOTED
SELECT @SQL = @SQL + ',' + QUOTENAME(Arrival),
@SQL2 = @SQL2 + '+ISNULL(' + QUOTENAME(Arrival) + ', 0)',
@SQL3 = @SQL3 + ',' + QUOTENAME(Arrival) + ' = ISNULL(' + QUOTENAME(Arrival) + ', 0)'
FROM (SELECT DISTINCT Arrival FROM tblSource) s;
-- COMBINE THEM INTO A SINGLE QUERY
SET @SQL = 'SELECT [Prov]' + @SQL3 + ', [Total] = ' + STUFF(@SQL2, 1, 1, '') + '
FROM ( SELECT Arrival, Prov, Amount
FROM [tblSource]
UNION ALL
SELECT Arrival, ''Total'', SUM(Amount)
FROM [tblSource]
GROUP BY Arrival
) up
PIVOT
( SUM(Amount)
FOR Arrival IN (' + STUFF(@SQL, 1, 1, '') + ')
) pvt;';
-- EXECUTE THE QUERY
EXECUTE SP_EXECUTESQL @SQL;
これにより、次の SQL が作成されて実行されます。
SELECT [Prov],
[2013-01-01] = ISNULL([2013-01-01], 0),
[2013-02-01] = ISNULL([2013-02-01], 0),
[Total] = ISNULL([2013-01-01], 0) + ISNULL([2013-02-01], 0)
FROM ( SELECT Arrival, Prov, Amount
FROM [tblSource]
UNION ALL
SELECT Arrival, 'Total', SUM(Amount)
FROM [tblSource]
GROUP BY Arrival
) up
PIVOT
( SUM(Amount)
FOR Arrival IN ([2013-01-01],[2013-02-01])
) pvt;
下部に合計行を追加するのは、サブクエリのユニオンの下のクエリup
であり、行の合計は、行のすべての列を追加することによって単純に作成されます。
SQL Fiddle の例
もう一度強調しますが、SQL の外部でこのようなデータ操作を処理することを強くお勧めします。
編集
UNION を使用して合計行を取得する代わりに、GROUPING SETS
次のように使用することもできます。
DECLARE @SQL NVARCHAR(MAX) = '',
@SQL2 NVARCHAR(MAX) = '',
@SQL3 NVARCHAR(MAX) = '';
-- COMPILE THE UNIQUE VALUES FOR ARRIVAL THAT NEED TO BE PIVOTED
SELECT @SQL = @SQL + ',' + QUOTENAME(Arrival),
@SQL2 = @SQL2 + '+ISNULL(' + QUOTENAME(Arrival) + ', 0)',
@SQL3 = @SQL3 + ',' + QUOTENAME(Arrival) + ' = ISNULL(' + QUOTENAME(Arrival) + ', 0)'
FROM (SELECT DISTINCT Arrival FROM tblSource) s;
-- COMBINE THEM INTO A SINGLE QUERY
SET @SQL = 'SELECT [Prov]' + @SQL3 + ', [Total] = ' + STUFF(@SQL2, 1, 1, '') + '
FROM ( SELECT Arrival, Prov = ISNULL(Prov, 'Total'), Amount = SUM(Amount)
FROM [tblSource]
GROUP BY GROUPING SETS((Prov, arrival), (arrival))
) up
PIVOT
( SUM(Amount)
FOR Arrival IN (' + STUFF(@SQL, 1, 1, '') + ')
) pvt;';
-- EXECUTE THE QUERY
EXECUTE SP_EXECUTESQL @SQL;