Vấn đề với truy vấn hiện tại của bạn là với dòng:
MAX(SERVER_ID)
Bạn muốn hiển thị PROPERTY_CHAR_VAL
cho mỗi PROPERTY_NAME
thay vì. SERVER_ID
sẽ là một phần của kết quả cuối cùng dưới dạng một cột.
Đôi khi khi bạn đang làm việc với PIVOT, việc viết mã trước tiên dễ dàng hơn với các giá trị được mã hóa cứng tương tự như:
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;
Xem SQL Fiddle với Demo .
Khi bạn có một phiên bản có logic chính xác, thì bạn có thể chuyển đổi nó sang SQL động để nhận được kết quả. Thao tác này sẽ tạo một chuỗi sql sẽ được thực thi và nó sẽ bao gồm tất cả các tên cột mới của bạn.
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;
Xem SQL Fiddle với Demo . Cả hai sẽ cho một kết quả:
| ID | NAME1 | NAME2 | NAME3 | NAME4 | NAME6 |
|----|--------|--------|--------|--------|--------|
| 1 | value | value | value | (null) | (null) |
| 2 | (null) | value | (null) | value | (null) |
| 3 | (null) | (null) | (null) | (null) | value |