Это может привести к некоторому неуклюжему ответу, но, во-первых, я обычно работаю в MSSQL T-SQL, а во-вторых, сайт не поддерживает более одной команды, поэтому вы не можете написать процесс с использованием переменных. и прочее, если я что-то упустил.
Вы получаете список всех событий, которым обучает конкретный сотрудник, объединяя учителей с событиями - даже в первом и в идентификаторе второго:
select * from event e
inner join teaches t
on t.event = e.id
получив этот набор данных, вы можете использовать агрегатную функцию 'sum' над полем event.duration для расчета общего количества часов. Если вы просто суммируете это сразу, вы получите общую длину всех событий во всей базе данных, но если вы используете 'group by' в идентификаторе персонала, он будет суммировать часы каждого сотрудника отдельно - group by довольно очень важно при работе с агрегатными функциями:
select t.staff as staff, sum(duration) as contactHours from event e
inner join teaches t
on t.event = e.id
group by t.staff
Вы можете использовать эти данные, чтобы рассчитать среднее количество преподаваемых часов, так же, как вы рассчитали бы среднее с ручкой и бумагой - сложите часы для каждого сотрудника, разделив их на количество сотрудников. На этот раз мы можем использовать агрегатные функции count и sum без группировки, потому что мы действительно хотим работать над всем набором данных. Однако, так как нам нужен групповой режим для подсчета часов для каждого сотрудника, нам нужно разделить два выбора ... один из способов - это выборочный выбор, который я здесь назвал 'staffContact':
select sum(contactHours) / count(staff) as averageHours
from
(
select t.staff as staff, sum(duration) as contactHours from event e
inner join teaches t
on t.event = e.id
group by t.staff
) staffContact
Это даст вам средние часы. Вам не нужна таблица «встречается», потому что вопрос не имеет значения, о какой неделе вы говорите, он просто спрашивает, сколько времени сотрудник проводит в мероприятиях.