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

SQLServer2008の垂直方向のデータから水平方向へ

    PIVOT関数を使用して、データの行を列に変換できます。

    元のクエリを使用してすべてのデータを取得できます。これに加える唯一の変更は、列b.field_idを除外することです。 これにより、結果の最終的な表示が変更されるためです。

    field_nameの既知のリストがある場合 列に変換する値を指定すると、クエリをハードコーディングできます:

    select app_id,
      [First Name], [Last Name], [DOB],
      [Mailing Addr], [Zip]
    from
    (
      SELECT 
         a.app_id, 
         c.field_name,
         b.field_value 
      FROM table1 a
      INNER JOIN table2 b 
        ON a.app_id = b.app_id
      INNER JOIN table3 c 
        ON b.field_id = c.field_id 
    ) d
    pivot
    (
      max(field_value)
      for field_name in ([First Name], [Last Name], [DOB],
                         [Mailing Addr], [Zip])
    ) piv;
    

    SQL FiddlewithDemoを参照してください。

    ただし、field_nameの値の数が不明な場合 、次に結果を得るには動的SQLを実装する必要があります:

    DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)
    
    select @cols = STUFF((SELECT ',' + QUOTENAME(Field_name) 
                        from Table3
                        group by field_name, Field_id
                        order by Field_id
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    set @query = 'SELECT app_id,' + @cols + ' 
                from 
                (
                  SELECT 
                     a.app_id, 
                     c.field_name,
                     b.field_value 
                  FROM table1 a
                  INNER JOIN table2 b 
                    ON a.app_id = b.app_id
                  INNER JOIN table3 c 
                    ON b.field_id = c.field_id 
                ) x
                pivot 
                (
                    max(field_value)
                    for field_name in (' + @cols + ')
                ) p '
    
    execute sp_executesql @query;
    

    SQL FiddlewithDemoを参照してください。これらの両方が結果をもたらします:

    | APP_ID | FIRST NAME | LAST NAME |      DOB |    MAILING ADDR |   ZIP |
    ------------------------------------------------------------------------
    |   1234 |        Joe |     Smith | 10/15/72 |     PO Box 1234 | 12345 |
    |   1239 |        Bob |   Johnson | 12/01/78 | 1234 N Star Ave | 12456 |
    


    1. IRIWorkbenchでTeradataに接続する

    2. MySQL-1つのクエリで異なる値を持つ複数の行を更新します

    3. AndroidSQLiteの挿入または更新

    4. Mysqlの行サイズの変更制限が大きすぎます