Anda dapat menggunakan fungsi jendela dan agregasi bersyarat:
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
Subquery memberi peringkat orang-orang yang memiliki penghuni yang sama berdasarkan nama. Anda kemudian dapat menggunakan informasi tersebut untuk menghasilkan baris, dan mengakses nama yang sesuai untuk setiap pekerjaan dengan agregat bersyarat.
Tanpa fungsi jendela, itu berbeda. Jika data Anda tidak terlalu besar, satu opsi mengemulasi nomor baris dengan subkueri:
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