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

列ヘッダーとしてテーブルから値を選択する

    RDBMS を指定していません。変換する列の数がわかっている場合は、値をハードコーディングできます:

    select FileId,
      max(case when property = 'Name' then value end) Name,
      max(case when property = 'Size' then value end) Size,
      max(case when property = 'Type' then value end) Type
    from yourtable
    group by FileId
    

    これは基本的に PIVOT です 一部の RDBMS には PIVOT があります。 、そうする場合は、次の PIVOT を使用できます SQL Server、Oracle で利用可能:

    select *
    from 
    (
      select FileId, Property, Value
      from yourTable
    ) x
    pivot
    (
      max(value)
      for property in ([Name], [Size], [Type])
    ) p
    

    変換する列の数が不明な場合は、動的な PIVOT を使用できます .これは、実行時に変換する列のリストを取得します:

    DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)
    
    select @cols = STUFF((SELECT distinct ',' + QUOTENAME(property) 
                        from yourtable
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    set @query = 'SELECT ' + @cols + ' from 
                 (
                    select FileId, Property, Value
                    from yourtable
                ) x
                pivot 
                (
                    max(value)
                    for Property in (' + @cols + ')
                ) p '
    
    execute(@query)
    


    1. SQLServer2008でページネーションを行う方法

    2. PHPとMySQLを使用した動的検索クエリの作成

    3. mysql.connectorでクエリキャッシュを無効にする方法

    4. PostgreSQLの関数内でSELECTの結果を返す方法は?