Here's one option: use listagg
function whose separator is the <br>
tag. For all columns that use it, set "Escape special characters" property to "No".
Query (along with some sample data):
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;
Output looks like this:
Or, with a much less effort, according to @Jeffrey Kemp's smart idea, simply set break on the 1st column (open report's attributes, scroll down "Break Formatting" set of properties and set break to "First column".
If I were you, I'd use this option.
Query itself is also simpler, no need for any kind of aggregates:
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;