Sie können dies mit dynamischem PIVOT tun und die ROW_NUMBER() Funktion:
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 ('example@sqldat.com+')) p
'
EXEC (@query)
SQL-Geige - eindeutige Liste, bestimmte Reihenfolge
Bearbeiten:Wenn Sie nicht möchten, dass die Liste eindeutig ist, entfernen Sie das erste cte oben, und wenn Sie eine willkürliche Reihenfolge beibehalten möchten, ändern Sie den ORDER BY zu (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 ('example@sqldat.com+')) p
'
EXEC (@query)
SQL Fiddle - Vollständige Liste, beliebige Reihenfolge
Und schließlich, wenn Sie den RowRank nicht wollten Feld in Ihren Ergebnissen, verwenden Sie einfach den @cols erneut Variable in Ihrem SELECT :
SET @query = '
WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY Name ORDER BY (SELECT 1))RowRank
FROM #test)
SELECT 'example@sqldat.com+'
FROM cte
PIVOT (max(Apt) for Name in ('example@sqldat.com+')) p
'
EXEC (@query)