Du kan bruge vinduesfunktioner og betinget 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
Underforespørgslen rangerer personer med samme erhverv efter navn. Du kan derefter bruge disse oplysninger til at generere rækkerne og få adgang til det tilsvarende navn for hver besættelse med et betinget aggregat.
Uden vinduesfunktioner er det anderledes. Hvis dine data ikke er for store, emulerer én mulighed rækkenummer med en underforespørgsel:
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