これらの列の追加は非常に簡単です。最終的なクエリは
になりますSELECT Account, AccountName, [Feb-11],[Jan-11],[Mar-11] FROM
(SELECT
t1.Col_Name,
t2.Account,
t2.AccountName,
t2.Amount
FROM Table1 AS t1
JOIN Table2 AS t2 ON t1.Col_ID1 = t2.Col_ID2
) p
PIVOT
(
Sum ([Amount] )
FOR Col_Name IN
( [Feb-11],[Jan-11],[Mar-11] )
) AS pvt
サブクエリにt2.AccountNameが追加され、最初のSELECTにAccountとAccountNameが追加されています。それらをビルドステートメントに入れれば完了です:
DECLARE @query NVARCHAR(4000)
SET @query = N'SELECT Account, AccountName, ' + @cols +' FROM
(SELECT
t1.Col_Name,
t2.Account,
t2.AccountName,
t2.Amount
FROM Table1 AS t1
JOIN Table2 AS t2 ON t1.Col_ID1 = t2.Col_ID2
) p
PIVOT
(
Sum ([Amount] )
FOR Col_Name IN
( '+
@cols +' )
) AS pvt '
SQLインジェクションに関しては、誰かがTable1.Col_Name内に悪意のあるコードを何らかの形で埋め込んだ場合にのみ発生していることがわかります。それについて心配する必要がある場合は、この動的クエリを「ロックダウン」するよりも大きな問題が発生します。
>また、以下を使用して列のリスト(@Cols)を作成します。これは、列が短くて読みやすいためですが、主にXMLが好きではないためです。
DECLARE @cols NVARCHAR(2000)
SELECT @cols = isnull(@cols + ',', '') + '[' + Col_Name + ']'
FROM Table1
ORDER BY Col_Name