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

MSSQL動的ピボット列の値を列ヘッダーに

    現在のクエリの問題は次の行にあります:

    MAX(SERVER_ID)
    

    PROPERTY_CHAR_VALを表示したい PROPERTY_NAMEごとに 代わりは。 SERVER_ID 列として最終結果の一部になります。

    PIVOTを使用している場合は、次のようにハードコードされた値を使用して最初にコードを作成する方が簡単な場合があります。

    select id, name1, name2, name3, name4
    from
    (
      select id, property_name, property_value
      from yourtable
    ) d
    pivot
    (
      max(property_value)
      for property_name in (name1, name2, name3, name4)
    ) piv;
    

    SQL Fiddle withDemo を参照してください。 。

    正しいロジックを持つバージョンができたら、それを動的SQLに変換して結果を得ることができます。これにより、実行されるSQL文字列が作成され、新しい列名がすべて含まれます。

    DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)
    
    select @cols = STUFF((SELECT distinct ',' + QUOTENAME(PROPERTY_NAME) 
                        from yourtable
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    set @query = 'SELECT id, ' + @cols + ' 
                from 
                (
                  select id, property_name, property_value
                  from yourtable
                ) x
                pivot 
                (
                    max(property_value)
                    for property_name in (' + @cols + ')
                ) p '
    
    execute sp_executesql @query;
    

    SQL Fiddle withDemo を参照してください。 。どちらも結果が得られます:

    | ID |  NAME1 |  NAME2 |  NAME3 |  NAME4 |  NAME6 |
    |----|--------|--------|--------|--------|--------|
    |  1 |  value |  value |  value | (null) | (null) |
    |  2 | (null) |  value | (null) |  value | (null) |
    |  3 | (null) | (null) | (null) | (null) |  value |
    



    1. プリペアドステートメントを使用した動的列名+'sを含む変数を使用したSQLクエリ

    2. PHPのsha1()とMySQLのSHA()は同じ結果になりますか?

    3. 一意の制約、重複を回避する方法

    4. ClusterControlを使用してMySQLバックアップを検証する方法