Вопросы SQL - Средняя сложность - PullRequest
0 голосов
/ 08 февраля 2011

Я борюсь за Q10 - http://sqlzoo.net/a1m.htm

Чего я не понимаю, так это как рассчитать среднее количество часов на каждого сотрудника, и мне также нужно было бы внести таблицу встреч в это право?

Диаграмма ERD здесь - http://sqlzoo.net/a1.htm

Любая помощь будет оценена!

1 Ответ

1 голос
/ 08 февраля 2011

Это может привести к некоторому неуклюжему ответу, но, во-первых, я обычно работаю в 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

Это даст вам средние часы. Вам не нужна таблица «встречается», потому что вопрос не имеет значения, о какой неделе вы говорите, он просто спрашивает, сколько времени сотрудник проводит в мероприятиях.

...