sql >> Databasteknik >  >> RDS >> Sqlserver

Pivoter med dynamiska kolumner i SQL Server

Att lägga till dessa kolumner är väldigt enkelt. Den sista frågan skulle vara

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 

som har lagt till t2.AccountName i underfrågan, och Account och AccountName lagt till i den initiala SELECT. Kasta dem i build-satsen och du är klar:

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 ' 

När det gäller SQL-injektion, det enda sättet jag kan se att det händer är om någon på något sätt bäddar in skadlig kod i Table1.Col_Name, och om du behöver oroa dig för det har du större problem än att "låsa" den här dynamiska frågan.

Också värt att nämna, jag skulle använda följande för att bygga listan med kolumner (@Cols) eftersom den är kortare och lättare att läsa, men mest för att jag inte gillar XML.

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


  1. Lagra Android Firebase Auth-användare på ett säkert sätt i en MySQL-databas

  2. Fel:mysqladmin:uppdatering misslyckades; fel:'Okänt fel'

  3. MySQL GÅ MED endast den senaste raden?

  4. SOLR DataImport Error Det gick inte att köra frågan