sql >> Databáze >  >> RDS >> Sqlserver

Pivoty s dynamickými sloupci v SQL Server

Přidání těchto sloupců je velmi jednoduché. Poslední dotaz by byl

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 

který má t2.AccountName přidán do poddotazu a Account a AccountName přidán do počátečního SELECT. Vhoďte je do příkazu sestavení a máte hotovo:

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 ' 

Pokud jde o SQL injection, jediný způsob, jak to vidím, je, že někdo nějakým způsobem vloží škodlivý kód do Table1.Col_Name, a pokud se o to musíte starat, máte větší problémy než „uzamknout“ tento dynamický dotaz.

Za zmínku také stojí, že bych použil následující k vytvoření seznamu sloupců (@Cols), protože je kratší a snadněji čitelný, ale hlavně proto, že nemám rád XML.

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


  1. FULLTEXTOVÉ vyhledávání MySQL

  2. Databáze Oracle TNS Délka hodnoty pro klíč „zdroj dat“ překračuje svůj limit „128“

  3. Jak odstranit všechny osiřelé záznamy v MySQL?

  4. Naplňte INSERT výsledkem z SELECT