Один метод условного агрегирования:
select order_id,
max(item_category) filter (where seqnum = 1) as item_category_1,
max(item_category) filter (where seqnum = 2) as item_category_2,
max(item_category) filter (where seqnum = 3) as item_category_3
from (select t.*,
row_number() over (partition by order_id order by item_category) as seqnum
from t
) t
group by order_id;
Другое использование array_agg()
:
select order_id,
(array_agg(item_category order by item_category))[1] as item_category_1,
(array_agg(item_category order by item_category))[2] as item_category_2,
(array_agg(item_category order by item_category))[3] as item_category_3
from t
group by order_id;