Вы можете выбрать столбцы Least/Most,category,carname,aprofit
отдельно от вашего запроса выбора, а затем использовать условно DBMS_OUTPUT
.
Я использовал ваш образец набора данных из вывода в приведенном ниже коде, так как у меня нет вашей таблицы/ определения.
DECLARE
v_high_low VARCHAR2(40) := 'DUMMY';
v_category VARCHAR2(40) := 'DUMMY';
BEGIN
for rec_ IN
(
with t (high_low,category,carname,aprofit) AS
(
select 'Least profit in ','compact', 'Nissan Versa', 4 from dual union all
select 'Least profit in ','compact','Toyota Yaris', 4 from dual union all
select 'Least profit in ','luxury','Porsche', 40 from dual union all
select 'Least profit in ','van','Chrysler', 2 from dual union all
select 'Most profit in ','compact','Chevy Spark', 5 from dual union all
select 'Most profit in ','luxury','Audi', 45 from dual union all
select 'Most profit in ','van', 'Honda Odyssey', 9 from dual
)
SELECT * FROM t order by high_low,category,carname
)
LOOP
IF rec_.high_low != v_high_low OR rec_.category != v_category
THEN
DBMS_OUTPUT.PUT(rec_.high_low);
v_high_low := rec_.high_low;
END IF;
IF rec_.category != v_category
THEN
DBMS_OUTPUT.PUT_LINE(rec_.category);
v_category := rec_.category;
END IF;
DBMS_OUTPUT.PUT_LINE(' - '||rec_.carname||': '|| rec_.aprofit);
END LOOP;
END;
/
ДЕМО
РЕДАКТИРОВАТЬ - Добавление этой демонстрационной ссылки с процедурой с предоставлением фактических таблиц: DEMO2