Предполагая, что заголовки столбцов "john", "lucy" и т. Д. Являются фиксированными, вы можете сгруппировать по полю адреса и использовать функции if () в сочетании с операторами агрегирования для получения ваших результатов:
select max(if(forename='john',surname,null)) as john,
max(if(forename='lucy',surname,null)) as lucy,
max(if(forename='jenny',surname,null)) as jenny,
max(if(forename='steve',surname,null)) as steve,
max(if(forename='richard',surname,null)) as richard,
address
from tablename
group by address;
Хотя это немного хрупко.
Существует также функция group_concat, которую можно использовать (в определенных пределах) для выполнения чего-либо подобного, но она будет упорядочена по строкам, а не по столбцам, как вам кажется.
например.
select address, group_concat( concat( forename, surname ) ) tenants
from tablename
group by address;