Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Pivots mit dynamischen Spalten in SQL Server

Das Hinzufügen dieser Spalten ist sehr einfach. Die letzte Abfrage wäre

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 

die t2.AccountName zur Unterabfrage hinzugefügt hat und Account und AccountName zum anfänglichen SELECT hinzugefügt hat. Werfen Sie sie in die Build-Anweisung und Sie sind fertig:

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 ' 

Was die SQL-Injection betrifft, kann ich das nur sehen, wenn jemand irgendwie bösartigen Code in Table1.Col_Name einbettet, und wenn Sie sich darüber Sorgen machen müssen, haben Sie größere Probleme, als diese dynamische Abfrage zu "sperren".

Erwähnenswert ist auch, dass ich Folgendes verwenden würde, um die Liste der Spalten (@Cols) zu erstellen, weil sie kürzer und einfacher zu lesen ist, aber hauptsächlich, weil ich XML nicht mag.

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