Для каждой строки данных столбца, как отобразить несколько строк других столбцов в отчете classi c? - PullRequest
0 голосов
/ 20 июня 2020

У меня есть классный c отчет, который отображает процедуру для классов из таблицы. Выглядит это так: введите описание изображения здесь

Я хочу, чтобы в первом столбце «День занятий» было 5 значений c от «понедельник» до «четверг». В каждый из этих дней может быть несколько классов, поэтому во всех других столбцах может быть несколько строк для каждой строки в столбце «День класса». Как я могу это сделать?

Ответы [ 3 ]

2 голосов
/ 20 июня 2020

Classi c Отчеты поддерживают форматирование разрывов, которое должно делать то, что вам нужно.

Go в Атрибуты, в разделе Форматирование разрывов , установите Столбцы разрыва на Первый столбец .

1 голос
/ 20 июня 2020

Вот один вариант: используйте функцию 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;

Результат выглядит следующим образом:

image

Или , с гораздо меньшими усилиями, согласно умной идее @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;
image
0 голосов
/ 20 июня 2020

Просматривая ваш запрос, кажется, что решение можно оставить пустым, кроме одной записи в столбце class_day в день.

Select case when rn = 1 then class_day end as class_day_final, 
       start_time, end_time, unit_title
  From
(Select t.*, 
       row_number() over (partition by class_day order by start_time) as rn
  From (<your_query>) t)
Order by class_day, rn
...