Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

SQL Server 2008 Dữ liệu dọc sang ngang

Bạn có thể sử dụng hàm PIVOT để chuyển đổi các hàng dữ liệu thành cột.

Truy vấn ban đầu của bạn có thể được sử dụng để truy xuất tất cả dữ liệu, thay đổi duy nhất mà tôi thực hiện đối với nó là loại trừ cột b.field_id bởi vì điều này sẽ thay đổi hiển thị cuối cùng của kết quả.

Nếu bạn có danh sách field_name đã biết giá trị mà bạn muốn chuyển thành cột, sau đó bạn có thể mã hóa truy vấn của mình:

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;

Xem SQL Fiddle với Demo.

Nhưng nếu bạn sắp có một số lượng giá trị không xác định cho field_name , thì bạn sẽ cần triển khai SQL động để nhận được kết quả:

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;

Xem SQL Fiddle với Demo. Cả hai điều này sẽ cho kết quả:

| 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cài đặt Trình điều khiển JDBC của Microsoft SQL Server trong các công cụ Tích hợp dữ liệu Pentaho và Máy chủ BA

  2. Nhận Ngày trong năm từ một ngày trong SQL Server (T-SQL)

  3. Làm thế nào để thay thế nhiều ký tự trong SQL?

  4. Rủi ro xung đột UUID sử dụng các thuật toán khác nhau

  5. Có thể chọn dữ liệu máy chủ sql bằng cách sử dụng vị trí thứ tự cột không