आपकी वर्तमान क्वेरी में समस्या लाइन के साथ है:
MAX(SERVER_ID)
आप PROPERTY_CHAR_VAL
प्रदर्शित करना चाहते हैं प्रत्येक PROPERTY_NAME
. के लिए बजाय। SERVER_ID
एक कॉलम के रूप में अंतिम परिणाम का हिस्सा होगा।
कभी-कभी जब आप PIVOT के साथ काम कर रहे होते हैं, तो पहले कोड को हार्ड-कोडेड मानों के साथ लिखना आसान होता है:
select id, name1, name2, name3, name4
from
(
select id, property_name, property_value
from yourtable
) d
pivot
(
max(property_value)
for property_name in (name1, name2, name3, name4)
) piv;
देखें SQL Fiddle with Demo ।
एक बार आपके पास एक ऐसा संस्करण है जिसमें सही तर्क है, तो आप परिणाम प्राप्त करने के लिए इसे गतिशील SQL में परिवर्तित कर सकते हैं। यह एक sql स्ट्रिंग बनाएगा जिसे निष्पादित किया जाएगा और इसमें आपके सभी नए कॉलम नाम शामिल होंगे।
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(PROPERTY_NAME)
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT id, ' + @cols + '
from
(
select id, property_name, property_value
from yourtable
) x
pivot
(
max(property_value)
for property_name in (' + @cols + ')
) p '
execute sp_executesql @query;
देखें SQL Fiddle with Demo . दोनों एक परिणाम देंगे:
| ID | NAME1 | NAME2 | NAME3 | NAME4 | NAME6 |
|----|--------|--------|--------|--------|--------|
| 1 | value | value | value | (null) | (null) |
| 2 | (null) | value | (null) | value | (null) |
| 3 | (null) | (null) | (null) | (null) | value |