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 |