Можете да използвате прозоречни функции и условно агрегиране:
select
rn,
max(case when occupation = 'Doctor' then name end) doctor,
max(case when occupation = 'Singer' then name end) singer,
max(case when occupation = 'Actor' then name end) actor
from (
select t.*, row_number() over(partition by occupation order by name) rn
from mytable t
)
group by rn
Подзаявката класира лицата с една и съща професия по име. След това можете да използвате тази информация, за да генерирате редовете и да получите достъп до съответното име за всяка професия с условен агрегат.
Без прозоречни функции е различно. Ако вашите данни не са твърде големи, една опция емулира номер на ред с подзаявка:
select
rn,
max(case when occupation = 'Doctor' then name end) doctor,
max(case when occupation = 'Singer' then name end) singer,
max(case when occupation = 'Actor' then name end) actor
from (
select t.*,
(
select count(*)
from mytable t1
where t1.occupation = t.occupation and t1.name <= t.name
) rn
from mytable t
)
group by rn