Sie können Fensterfunktionen und bedingte Aggregation verwenden:
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
Die Unterabfrage ordnet Personen mit gleichem Beruf nach Namen. Sie können diese Informationen dann verwenden, um die Zeilen zu generieren, und mit einem bedingten Aggregat auf den entsprechenden Namen für jeden Beruf zugreifen.
Ohne Fensterfunktionen ist es anders. Wenn Ihre Daten nicht zu groß sind, emuliert eine Option die Zeilennummer mit einer Unterabfrage:
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