Можете да използвате функцията PIVOT, за да преобразувате вашите редове с данни в колони.
Вашата оригинална заявка може да се използва за извличане на всички данни, единствената промяна, която бих направил в нея, е да изключа колоната b.field_id
защото това ще промени крайното показване на резултата.
Ако имате известен списък с име_на_поле
стойности, които искате да превърнете в колони, тогава можете да кодирате заявката си:
изберете app_id, [First Name], [Last Name], [DOB], [Mailing Adr], [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 ) dpivot( max(field_value) за field_name в ([First Name], [Last Name], [DOB], [Mailing Adr ], [Zip])) piv;
Вижте SQL Fiddle с демонстрация.
Но ако ще имате неизвестен брой стойности за field_name
, тогава ще трябва да внедрите динамичен SQL, за да получите резултата:
ДЕКЛАРИРАЙТЕ @cols КАТО NVARCHAR(MAX), @query КАТО NVARCHAR(MAX)изберете @cols =STUFF((SELECT ',' + QUOTENAME(име_на_поле)) от група Table3 по име на поле, идентификатор на поле по идентификатор на поле ЗА XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')set @query ='ИЗБЕРЕТЕ app_id,' + @cols + ' от ( 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 опорна точка ( max(field_value) за име на поле в (' + @ cols + ') ) p 'изпълни sp_executesql @query;
Вижте SQL Fiddle с демонстрация. И двете ще дадат резултат:
<предварителен код>| APP_ID | ПЪРВО ИМЕ | ФАМИЛИЯ | DOB | АДРЕС ЗА ПОЩАНЕ | ZIP |------------------------------------------------ ------------------------| 1234 | Джо | Смит | 15.10.72 | Пощенска кутия 1234 | 12345 || 1239 | Боб | Джонсън | 12/01/78 | 1234 N Star Ave | 12456 |