create table policies (policy_no number, driver varchar2(20), gender varchar2(10),
age number, claims number);
insert into policies values (1, 'Smith', 'M', 40, 5);
insert into policies values (1, 'Jones', 'F', 35, 0);
insert into policies values (1, 'Brown', 'M', 44, 11);
insert into policies values (2, 'Smith', 'M', 40, 5);
insert into policies values (2, 'Williams', 'M', 44, 6);
insert into policies values (2, 'Lawrence', 'F', 21, 2);
insert into policies values (2, 'Johnson', 'M', 88, 1);
WITH res as
(select policy_no,
driver,
gender,
age,
claims,
row_number() over (partition by policy_no order by driver) as rn
from policies
where policy_no=2)
select max(case when rn=1 then driver end) as driver1,
max(case when rn=2 then driver end) as driver2,
max(case when rn=3 then driver end) as driver3,
max(case when rn=4 then driver end) as driver4
from res
union all
select max(case when rn=1 then gender end),
max(case when rn=2 then gender end),
max(case when rn=3 then gender end),
max(case when rn=4 then gender end)
from res
union all
select max(case when rn=1 then to_char(age) end),
max(case when rn=2 then to_char(age) end),
max(case when rn=3 then to_char(age) end),
max(case when rn=4 then to_char(age) end)
from res
union all
select max(case when rn=1 then to_char(claims) end),
max(case when rn=2 then to_char(claims) end),
max(case when rn=3 then to_char(claims) end),
max(case when rn=4 then to_char(claims) end)
from res
/
Johnson Lawrence Smith Williams
M F M M
88 21 40 44
1 2 5 6