Проблемът с текущата ви заявка е с реда:
MAX(SERVER_ID)
Искате да покажете PROPERTY_CHAR_VAL
за всяко PROPERTY_NAME
вместо. SERVER_ID
ще бъде част от крайния резултат като колона.
Понякога, когато работите с PIVOT, е по-лесно първо да напишете кода с твърдо кодирани стойности, подобно на:
изберете id, name1, name2, name3, name4from( изберете id, property_name, property_value от вашата таблица) dpivot( max(property_value) за property_name в (name1, name2, name3, name4)) piv;
Вижте SQL Fiddle с демонстрация .
След като имате версия, която има правилната логика, тогава можете да я конвертирате в динамичен 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 с демонстрация . И двете ще дадат резултат:
<предварителен код>| ID | ИМЕ1 | ИМЕ2 | ИМЕ3 | ИМЕ4 | ИМЕ6 ||----|--------|--------|--------|--------|------ --|| 1 | стойност | стойност | стойност | (нула) | (нула) || 2 | (нула) | стойност | (нула) | стойност | (нула) || 3 | (нула) | (нула) | (нула) | (нула) | стойност |