Sie können die PIVOT-Funktion verwenden, um Ihre Datenzeilen in Spalten umzuwandeln.
Ihre ursprüngliche Abfrage kann zum Abrufen aller Daten verwendet werden. Die einzige Änderung, die ich daran vornehmen würde, wäre, die Spalte b.field_id
auszuschließen da dies die endgültige Anzeige des Ergebnisses verändert.
Wenn Sie eine bekannte Liste von field_name
haben Werte, die Sie in Spalten umwandeln möchten, dann können Sie Ihre Abfrage fest codieren:
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;
Siehe SQL Fiddle mit Demo.
Aber wenn Sie eine unbekannte Anzahl von Werten für field_name
haben , dann müssen Sie dynamisches SQL implementieren, um das Ergebnis zu erhalten:
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;
Siehe SQL-Fiddle mit Demo. Beides ergibt folgendes Ergebnis:
| 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 |