Du kan använda fönsterfunktioner och villkorlig aggregering:
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
Underfrågan rangordnar personer som har samma sysselsättning efter namn. Du kan sedan använda den informationen för att generera raderna och komma åt motsvarande namn för varje yrke med ett villkorligt aggregat.
Utan fönsterfunktioner är det annorlunda. Om din data inte är för stor, emulerar ett alternativ radnummer med en underfråga:
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