Поскольку ваша таблица стоит, вы не можете использовать простое самосоединение, чтобы свести это к одной строке. Вы можете вернуть строки, которые имеют все адреса (при условии, что вы жестко запрограммировали конкретное максимальное количество адресов), но у вас всегда будет то же количество строк, что и адресов для данного пользователя (если у вас нет способ идентификации одного адреса как «основного»).
Чтобы свести ваш результирующий набор к одной строке, вам нужно будет каким-то образом пометить «первый» адрес. В SQL Server (или аналогичных RDBM профессионального уровня) для этого можно использовать общее табличное выражение с функциями ранжирования / нумерации строк:
with Addresses as
(select
CName,
AddressLine,
row_number() over (partition by CName order by AddressLine) as RowNum
from YourTable)
select
a1.CName,
a1.AddressLine as Address1,
a2.AddressLine as Address2,
a3.AddressLine as Address3
from Addresses a1
left join Addresses a2 on a2.CName = a1.CName and a2.RowNum = 2
left join Addresses a3 on a3.CName = a1.CName and a3.RowNum = 3
where a1.RowNum = 1