SQL问题 - 中等难度

时间:2011-02-08 10:40:51

标签: sql join average

我在Q10上挣扎 - http://sqlzoo.net/a1m.htm

我不明白的是如何计算每个工作人员的平均时间,我还需要将发生的表格纳入此权利?

ERD图表在这里 - http://sqlzoo.net/a1.htm

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

这可能会导致一些笨拙的答案,但首先我通常使用MSSQL T-SQL,其次该网站似乎不支持多个命令,因此您无法使用变量编写proc和东西,除非我遗漏了什么。

通过加入有关事件的教学,您可以获得特定职员教授的所有事件的列表 - 即使是前者,也可以是后者的身份:

select * from event e
inner join teaches t
on t.event = e.id

获得此数据集之后,您可以在event.duration字段上使用聚合函数“sum”来计算总小时数。如果您直接总结它,您将获得整个数据库中所有事件的总长度,但如果您在员工ID上使用“分组依据”,它将分别汇总每个员工的工作时间 - 分组依旧使用聚合函数时非常重要:

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'而不进行分组,因为我们确实想要处理整个数据集。但是,因为我们需要group-by来计算每个职员的工作时间,所以我们需要将两个选项分开......一种方式是作为子选择,这里我称之为'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

这会给你平均时间。你不需要'发生'表,因为这个问题并不关心你在谈论哪个星期,而只是询问员工在活动中花费了多少时间。