You could try dynamic SQL like this:

set pages 0 head off recsep off feed off term off
spo cross.sql
select 'select ID' from dual
union
select ',sum(decode(type,'||type||',area,0)) '||type
from (select distinct type from CROSS)
union
select ',sum(decode(category,'||category||',area,0)) '||category
from (select distinct category from CROSS)
union
select 'from CROSS group by id;' from dual
/
spo off
set pages 55 head on recsep on feed on term on
@cross.sql