Для меня работает со столбцом элемента, потому что я могу контролировать размер динамически генерируемой оси.Вы можете попробовать следующий код
CREATE TABLE #Table
(
UserId INT,
item INT,
EmailAddressID INT,
EmailAddress VARCHAR(50)
);
INSERT INTO #Table
SELECT '1', '1','1', 'email2@test.com' UNION ALL
SELECT '1', '2','2', 'email1@test.com' UNION ALL
SELECT '1', '3','3', 'email4@test.com' UNION ALL
SELECT '1', '4','4', 'email5@test.com'UNION ALL
SELECT '2', '1','5', 'email1@test.com' UNION ALL
SELECT '2', '2','6', 'email2@test.com' UNION ALL
SELECT '2', '3','7', 'email3@test.com' UNION ALL
SELECT '2', '4','8', 'email4@test.com' UNION ALL
SELECT '2', '5','9', 'email5@test.com' UNION ALL
SELECT '3', '1','10', 'email1@test.com' UNION ALL
SELECT '3', '2','11', 'email2@test.com'
DECLARE @MaxItem INT
SELECT TOP 1 @MaxItem = UserId
FROM
(SELECT UserId, COUNT(1) AS cont
FROM #Table
GROUP BY UserId) a
GROUP BY
UserId
ORDER BY
MAX(a.cont) DESC
DECLARE @columns VARCHAR(MAX);
DECLARE @sql NVARCHAR(max)
SET @columns = STUFF((SELECT ',' + QUOTENAME(item)
FROM
(SELECT item
FROM #Table
WHERE UserId = @MaxItem) AS T
ORDER BY item
FOR XML PATH('')), 1, 1, '');
--SELECT * FROM ( SELECT UserId, EmailAddress,EmailAddressID FROM #Table ) AS T PIVOT ( MAX(EmailAddress) FOR EmailAddressID IN ([1],[2],[3],[4],[5]) ) AS P order by UserId;
SET @sql = N'SELECT *
FROM
(SELECT UserId, EmailAddress, item
FROM #Table) AS T
PIVOT
(MAX(EmailAddress)
FOR item IN (' + @columns + N')) AS P
ORDER BY UserId;';
-- select @sql
EXEC sp_executesql @sql;
DROP TABLE #Table;