Vous pouvez utiliser les fonctions de fenêtrage et l'agrégation conditionnelle :
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
La sous-requête classe les personnes ayant la même occupation par leur nom. Vous pouvez ensuite utiliser ces informations pour générer les lignes et accéder au nom correspondant pour chaque profession avec un agrégat conditionnel.
Sans les fonctions de fenêtre, c'est différent. Si vos données ne sont pas trop volumineuses, une option émule le numéro de ligne avec une sous-requête :
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