Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Pivot con colonne dinamiche in SQL Server

L'aggiunta di quelle colonne è molto semplice. La domanda finale sarebbe

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 

che ha t2.AccountName aggiunto alla sottoquery e Account e AccountName aggiunti alla SELECT iniziale. Lanciali nella dichiarazione di build e il gioco è fatto:

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 ' 

Per quanto riguarda l'iniezione SQL, l'unico modo in cui posso vedere che ciò accade è se qualcuno in qualche modo incorpora codice dannoso all'interno di Table1.Col_Name e se devi preoccuparti di questo, hai problemi più grandi del "blocco" di questa query dinamica.

Vale anche la pena ricordare che userei quanto segue per creare l'elenco di colonne (@Cols) perché è più breve e più facile da leggere, ma soprattutto perché non mi piace XML.

DECLARE @cols NVARCHAR(2000)    
SELECT @cols = isnull(@cols + ',', '') + '[' + Col_Name + ']'
 FROM Table1
 ORDER BY Col_Name