U kunt vensterfuncties en voorwaardelijke aggregatie gebruiken:
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
De subquery rangschikt personen met hetzelfde beroep op naam. U kunt die informatie vervolgens gebruiken om de rijen te genereren en toegang te krijgen tot de bijbehorende naam voor elk beroep met een voorwaardelijk aggregaat.
Zonder vensterfuncties is het anders. Als uw gegevens niet te groot zijn, emuleert één optie het rijnummer met een subquery:
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