sql >> Database >  >> RDS >> Sqlserver

Pivots met dynamische kolommen in SQL Server

Het toevoegen van die kolommen is heel eenvoudig. De laatste vraag zou zijn

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 

waarbij t2.AccountName is toegevoegd aan de subquery en Account en AccountName zijn toegevoegd aan de initiële SELECT. Gooi ze in de build-verklaring en je bent klaar:

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 ' 

Wat betreft SQL-injectie, de enige manier waarop ik kan zien dat dit gebeurt, is als iemand op de een of andere manier kwaadaardige code insluit in Table1.Col_Name, en als je je daar zorgen over moet maken, heb je grotere problemen dan het "vergrendelen" van deze dynamische query.

Ook het vermelden waard, ik zou het volgende gebruiken om de lijst met kolommen (@Cols) samen te stellen omdat het korter en gemakkelijker te lezen is, maar vooral omdat ik niet van XML houd.

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


  1. org.postgresql.util.PSQLException:De kolomindex is buiten bereik:3, aantal kolommen:2

  2. SQL om vrienden EN vrienden van vrienden van een gebruiker te krijgen

  3. 12 Best Practices voor MySQL/MariaDB-beveiliging voor Linux

  4. org.postgresql.util.PSQLException:Grote objecten mogen niet worden gebruikt in de modus voor automatisch vastleggen