Это не реляционная структура, потому что столбцы в строке на самом деле не связаны друг с другом.По этой причине этот тип преобразования часто лучше выполнять на уровне приложения.
Тем не менее, вы можете сделать это в Oracle.Одним из методов является условная агрегация:
select col1,
max(case when col3 = 'CAT1' then col2 end) as cat1,
max(case when col3 = 'CAT2' then col2 end) as cat2
from (select t.*, row_number() over (partition by col1, col3 order by col2) as seqnum
from t
) t
group by col1, seqnum
order by col1, seqnum;