Bạn có thể thực hiện việc này với PIVOT
động và ROW_NUMBER()
chức năng:
DECLARE @cols AS VARCHAR(1000),
@query AS VARCHAR(8000)
SELECT @cols = STUFF((SELECT ',' + QUOTENAME(Name)
FROM (SELECT DISTINCT Name
FROM #test
)sub
ORDER BY Name
FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)')
,1,1,'')
PRINT @cols
SET @query = '
WITH cte AS (SELECT DISTINCT *
FROM #test)
,cte2 AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY Name ORDER BY Apt)RowRank
FROM cte)
SELECT *
FROM cte2
PIVOT (max(Apt) for Name in ('[email protected]+')) p
'
EXEC (@query)
SQL Fiddle - Danh sách riêng, Thứ tự cụ thể
Chỉnh sửa:Nếu bạn không muốn danh sách khác biệt, hãy loại bỏ cte đầu tiên ở trên và nếu bạn muốn giữ thứ tự tùy ý, hãy thay đổi ORDER BY
thành (SELECT 1)
:
DECLARE @cols AS VARCHAR(1000),
@query AS VARCHAR(8000)
SELECT @cols = STUFF((SELECT ',' + QUOTENAME(Name)
FROM (SELECT DISTINCT Name
FROM #test
)sub
ORDER BY Name
FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)')
,1,1,'')
PRINT @cols
SET @query = '
WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY Name ORDER BY (SELECT 1))RowRank
FROM #test)
SELECT *
FROM cte
PIVOT (max(Apt) for Name in ('[email protected]+')) p
'
EXEC (@query)
SQL Fiddle - Danh sách đầy đủ, Thứ tự tùy ý
Và cuối cùng, nếu bạn không muốn RowRank
trong kết quả của bạn, chỉ cần sử dụng lại @cols
trong SELECT
của bạn :
SET @query = '
WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY Name ORDER BY (SELECT 1))RowRank
FROM #test)
SELECT '[email protected]+'
FROM cte
PIVOT (max(Apt) for Name in ('[email protected]+')) p
'
EXEC (@query)