Лучше, конечно, вертикальную выборку перерабатывать в горизонтальную не в SQL, а в той процедурной прослойке, которая вызывает запрос.
На SQL можно такое провернуть, но будет не универсально (фиксированное число столбцов в итоговой выборке).
with main_tb (id, detal, mono, row_num) as (select id,
detal,
mono
row_number() over (partition by detal order by id) as row_num
from tb)
select t.id,
t.detal,
t.name,
(select t1.mono from main_tb as t1 where t1.detal = t.detal and t1.row_num = 1) mono,
(select t1.mono from main_tb as t1 where t1.detal = t.detal and t1.row_num = 2) mono2,
(select t1.mono from main_tb as t1 where t1.detal = t.detal and t1.row_num = 3) mono3
from tb as t