Du kan gøre dette med dynamisk PIVOT og 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 Fiddle - Distinct List, Specific Order
Rediger:Hvis du ikke ønsker, at listen skal være særskilt, skal du fjerne den første cte ovenfor, og hvis du vil fortsætte med vilkårlig rækkefølge, skal du ændre ORDER BY til (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 - Fuld liste, vilkårlig rækkefølge
Og endelig, hvis du ikke ville have RowRank feltet i dine resultater, skal du blot genbruge @cols variabel i din 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)