Pivots with dynamic columns in SQL Server

后端 未结 2 995
-上瘾入骨i
-上瘾入骨i 2020-12-01 23:56

I am working on an SQL Query using pvots with dynamic columns in SQL Server (T-sql). Rather than submitting my lengthy query, I’m illustrating my problem with a simplified

2条回答
  •  情深已故
    2020-12-02 00:55

    Adding those columns is very simple. The final query would be

    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 
    

    which has t2.AccountName added to the subquery, and Account and AccountName added to the initial SELECT. Toss them into the build statement and you're done:

    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 ' 
    

    As for SQL injection, the only way I can see that happening is if someone somehow embeds malicious code within Table1.Col_Name, and if you have to worry about that, you have bigger problems than "locking down" this dynamic query.

    Also worth mentioning, I'd use the following to build the list of columns (@Cols) because its shorter and easier to read, but mostly because I don't like XML.

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

提交回复
热议问题