Я ответил похожим на это перед использованием приведенного ниже сценария.Логика будет такой же, просто измените имена таблиц / полей, чтобы они соответствовали вашему;
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX);
SET @cols = STUFF((SELECT distinct ',MAX(CASE WHEN UserName = '''
+ p.UserName + ''' THEN FriendName END) AS '
+ QUOTENAME(p.UserName) FROM Popular p
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'')
SET @query = 'SELECT ' + @cols + ' FROM
(SELECT UserName, FriendName
,ROW_NUMBER() OVER (PARTITION BY UserName ORDER BY FriendName) AS RowNum
FROM Popular GROUP BY USERNAME, FRIENDNAME
) x
GROUP BY RowNum'
EXECUTE(@query);
Это приведет к появлению столбцов пользователей с их друзьями в новых строках в соответствии с этим;
╔════════╦══════╦════════╗
║ John ║ Khan ║ Philip ║
╠════════╬══════╬════════╣
║ Jeremy ║ Lemy ║ Brock ║
║ Marry ║ NULL ║ Ursula ║
║ Sarah ║ NULL ║ NULL ║
╚════════╩══════╩════════╝
оригинальную тему можно найти здесь; SQL - объединение всех пользователей в одну таблицу