Вы можете использовать row_number()
и сводную или условную агрегацию:
select id,
max(case when seqnum = 1 then vehicle end) as vehicle_1,
max(case when seqnum = 2 then vehicle end) as vehicle_2,
. . .
max(case when seqnum = n then vehicle end) as vehicle_n
from (select t.*,
row_number() over (partition by id order by vehicle) as seqnum
from t
) t
group by id;
Это предполагает, что вы знаете количество столбцов, которое вы хотите в наборе результатов. Если это не так, вам нужно использовать динамический SQL - или объединить транспортные средства в строку.