sql >> データベース >  >> RDS >> Sqlserver

SQLServerの動的列を持つピボット

    これらの列の追加は非常に簡単です。最終的なクエリは

    になります
    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 
    

    サブクエリにt2.AccountNameが追加され、最初のSELECTにAccountとAccountNameが追加されています。それらをビルドステートメントに入れれば完了です:

    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 ' 
    

    SQLインジェクションに関しては、誰かがTable1.Col_Name内に悪意のあるコードを何らかの形で埋め込んだ場合にのみ発生していることがわかります。それについて心配する必要がある場合は、この動的クエリを「ロックダウン」するよりも大きな問題が発生します。

    >

    また、以下を使用して列のリスト(@Cols)を作成します。これは、列が短くて読みやすいためですが、主にXMLが好きではないためです。

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


    1. トリガーの実行後に値を挿入

    2. ページ変更履歴を保持します。 SOがリビジョンに対して行うのと少し似ています

    3. Cakephp3でデータベース接続を動的に変更する

    4. SQL Server 2005にはMySqlのENUMデータ型と同等のものがありますか?