Vous pouvez utiliser la fonction PIVOT pour convertir vos lignes de données en colonnes.
Votre requête d'origine peut être utilisée pour récupérer toutes les données, la seule modification que j'y apporterais serait d'exclure la colonne b.field_id
car cela modifiera l'affichage final du résultat.
Si vous avez une liste connue de field_name
valeurs que vous souhaitez transformer en colonnes, vous pouvez alors coder en dur votre requête :
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;
Voir SQL Fiddle avec démo.
Mais si vous allez avoir un nombre inconnu de valeurs pour field_name
, vous devrez alors implémenter du SQL dynamique pour obtenir le résultat :
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;
Voir SQL Fiddle avec démo. Ces deux éléments donneront un résultat :
| 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 |