Предполагая недавний SQL Server и основываясь на превосходном предложении здесь , он выберет первые два столбца отдельно, а последнюю часть в виде строки, разделенной запятыми;
SELECT id, ColA,
REPLACE(
(SELECT ColB AS [data()]
FROM TableA a2
WHERE a1.id=a2.id
ORDER BY a2.ColB FOR XML PATH('')),
' ', ', ')
FROM TableA a1
GROUP BY id, ColA;
Демо здесь .
Редактировать: Конечно, вы можете получить все это как одну строку, если хотите, просто замените первую строку на
SELECT CAST(id AS VARCHAR(16)) + ', ' + ColA + ', ' +