आप डेटा की अपनी पंक्तियों को कॉलम में बदलने के लिए PIVOT फ़ंक्शन का उपयोग कर सकते हैं।
आपकी मूल क्वेरी का उपयोग सभी डेटा को पुनः प्राप्त करने के लिए किया जा सकता है, केवल एक ही परिवर्तन मैं इसमें करूँगा b.field_id
कॉलम को बाहर करना होगा क्योंकि यह परिणाम के अंतिम प्रदर्शन को बदल देगा।
यदि आपके पास field_name
. की एक ज्ञात सूची है वे मान जिन्हें आप कॉलम में बदलना चाहते हैं, फिर आप अपनी क्वेरी को हार्ड-कोड कर सकते हैं:
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;
डेमो के साथ SQL Fiddle देखें।
लेकिन अगर आपके पास field_name
. के लिए अज्ञात संख्या में मान होने वाले हैं , तो आपको परिणाम प्राप्त करने के लिए गतिशील SQL लागू करने की आवश्यकता होगी:
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;
डेमो के साथ SQL Fiddle देखें। इन दोनों का यह परिणाम देगा:
| 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 |