Bạn có thể thêm một số hàng vào tên thuộc tính để cho phép bạn làm những gì bạn muốn:
SELECT * FROM
(
SELECT ENTITYID
, PROPERTYNAME = PROPERTYNAME + CAST(ROW_NUMBER() OVER(PARTITION BY ENTITYID, PROPERTYNAME ORDER BY PROPERTYVALUE) AS VARCHAR(5))
,PROPERTYVALUE
FROM #STAGING
) AS T
PIVOT (MAX(PROPERTYVALUE) FOR PROPERTYNAME IN (NAME1, SPOUSE1, CHILD1, CHILD2, CHILD3, CHILD4, CHILD5)) AS T2
Tôi giả sử ở đây rằng ENTITYID liên kết con cái với cha mẹ, tức là tất cả con cái của cùng một người đều có ENTITYID là 1, nhưng ví dụ của bạn cho thấy Kayala là 2.
Đây là bản trình diễn: SQL Fiddle
Nếu bạn chỉ muốn các số cho các trường CON, bạn có thể đặt sau:
PROPERTYNAME = CASE WHEN PROPERTYNAME LIKE '%CHILD%' THEN PROPERTYNAME + CAST(ROW_NUMBER() OVER(PARTITION BY ENTITYID, PROPERTYNAME ORDER BY PROPERTYVALUE) AS VARCHAR(5)) ELSE PROPERTYNAME END
Sau đó, xóa số khỏi các trường khác trong câu lệnh IN () của bạn.
Câu hỏi thưởng- Thực hiện động ở trên: Chúng tôi không muốn cho rằng mọi người chỉ có một vợ / chồng hoặc 2,3 đứa con, vì vậy chúng tôi thực hiện toàn bộ một cách linh động:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
SELECT @cols = STUFF((SELECT ',' + PROPERTYNAME
FROM (SELECT DISTINCT PROPERTYNAME = PROPERTYNAME + CAST(ROW_NUMBER() OVER(PARTITION BY ENTITYID, PROPERTYNAME ORDER BY PROPERTYVALUE) AS VARCHAR(5))
FROM STAGING )sub
ORDER BY CASE WHEN PROPERTYNAME LIKE '%NAME%' THEN 1
WHEN PROPERTYNAME LIKE '%SPOUSE%' THEN 2
WHEN PROPERTYNAME LIKE '%CHILD%' THEN 3
ELSE 4
END
,RIGHT(PROPERTYNAME,1)
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
SET @query = 'SELECT * FROM
(
SELECT ENTITYID, PROPERTYNAME = PROPERTYNAME + CAST(ROW_NUMBER() OVER(PARTITION BY ENTITYID, PROPERTYNAME ORDER BY PROPERTYVALUE) AS VARCHAR(5)),PROPERTYVALUE
FROM STAGING
) AS T
PIVOT (MAX(PROPERTYVALUE) FOR PROPERTYNAME IN ('[email protected]+')) AS T2
'
EXEC(@query)
Lưu ý:Việc đặt hàng sẽ chỉ áp dụng cho vợ chồng 1-9 và con 1-9, bạn có thể điều chỉnh cho phù hợp, nhưng tùy ý.