Вот один вариант: используйте функцию listagg
, разделителем которой является тег <br>
. Для всех столбцов, в которых он используется, установите для свойства «Escape special characters» значение «No».
Запрос (вместе с некоторыми примерами данных):
with routine (datum, class_name, room) as
(select to_date('15.06.2020 07:00', 'dd.mm.yyyy hh24:mi'), 'Maths' , 502 from dual union all
select to_date('15.06.2020 10:00', 'dd.mm.yyyy hh24:mi'), 'Physics' , 555 from dual union all
select to_date('15.06.2020 12:00', 'dd.mm.yyyy hh24:mi'), 'Bio' , 301 from dual union all
select to_date('16.06.2020 09:00', 'dd.mm.yyyy hh24:mi'), 'Chemistry', 422 from dual union all
select to_date('16.06.2020 13:00', 'dd.mm.yyyy hh24:mi'), 'English' , 415 from dual
)
select to_char(datum, 'dd.mm., day') dan,
listagg(to_char(datum, 'hh24:mi'), '<br>') within group (order by datum) sat,
listagg(class_name , '<br>') within group (order by datum) classes,
listagg(room , '<br>') within group (order by datum) rooms
from routine
group by to_char(datum, 'dd.mm., day')
order by 1;
Результат выглядит следующим образом:
Или , с гораздо меньшими усилиями, согласно умной идее @Jeffrey Kemp, просто установите разрыв в 1-м столбце (откройте атрибуты отчета, прокрутите вниз набор свойств «Разрыв форматирования» и установите разрыв на «Первый столбец».
Если бы я был на вашем месте, я бы использовал эту опцию.
Сам запрос также стал проще, никаких агрегатов не требуется:
with routine as
(sample data remains as it was in previous example)
select to_char(datum, 'dd.mm., day') dan,
to_char(datum, 'hh24:mi') sat,
class_name,
room
from routine
order by dan, sat;