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

Pivoter med dynamiske kolonner i SQL Server

Det er meget enkelt at tilføje disse kolonner. Den endelige forespørgsel ville væ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 

som har tilføjet t2.AccountName til underforespørgslen, og Account and AccountName tilføjet til det indledende SELECT. Smid dem ind i build-erklæringen, og du er færdig:

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 ' 

Hvad angår SQL-injektion, er den eneste måde, jeg kan se, at det sker på, hvis nogen på en eller anden måde indlejrer ondsindet kode i Table1.Col_Name, og hvis du skal bekymre dig om det, har du større problemer end at "låse" denne dynamiske forespørgsel.

Også værd at nævne, jeg ville bruge følgende til at bygge listen over kolonner (@Cols), fordi den er kortere og lettere at læse, men mest fordi jeg ikke kan lide XML.

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


  1. Sammenfletning af datafiler med Statistica, del 2

  2. MySQL length() vs char_length()

  3. mysql vælg for at returnere tomme felter for alle undtagen første række af gentagne kolonner

  4. TSQL:Indlejret opdeling/parse af streng i tabel (flere sammenkædede Tag:Værdi i én streng)