U kunt de PIVOT-functie gebruiken om uw rijen met gegevens om te zetten in kolommen.
Uw oorspronkelijke zoekopdracht kan worden gebruikt om alle gegevens op te halen, de enige wijziging die ik zou aanbrengen zou zijn om de kolom b.field_id
uit te sluiten omdat dit de uiteindelijke weergave van het resultaat zal veranderen.
Als u een bekende lijst heeft van field_name
waarden die u in kolommen wilt omzetten, dan kunt u uw zoekopdracht hardcoderen:
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;
Zie SQL Fiddle met demo.
Maar als u een onbekend aantal waarden krijgt voor field_name
, dan moet u dynamische SQL implementeren om het resultaat te krijgen:
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;
Zie SQL Fiddle met demo. Dit geeft beide een resultaat:
| 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 |