with t as( select 'a1' as a from dual union select 'a2' as a from dual union select 'a3' as a from dual union select 'a4' as a from dual union select 'a5' as a from dual union select 'b1' as a from dual union select 'b2' as a from dual union select 'b3' as a from dual union select 'c1' as a from dual)select max(case substr(a,1,1) when 'a' then a else null end) a, max(case substr(a,1,1) when 'b' then a else null end) b, max(case substr(a,1,1) when 'c' then a else null end) c from t group by substr(a,2,1) order by substr(a,2,1)
select 'a1' as a from dual union
select 'a2' as a from dual union
select 'a3' as a from dual union
select 'a4' as a from dual union
select 'a5' as a from dual union
select 'b1' as a from dual union
select 'b2' as a from dual union
select 'b3' as a from dual union
select 'c1' as a from dual)select max(case substr(a,1,1) when 'a' then a else null end) a,
max(case substr(a,1,1) when 'b' then a else null end) b,
max(case substr(a,1,1) when 'c' then a else null end) c
from t
group by substr(a,2,1)
order by substr(a,2,1)