我有以下表格:
学生(sid,sname)
老师(tid,tname)报名(sid,cid,tid)
当然(cid,course)
排名(sid,tid,年级,日期,有效)
我需要计算所有教师的平均成绩(数据在排名表中),当只有最近日期的成绩计算时(如果它无效 - 忽略它)。
我编写了以下查询,并且它运行良好。问题是我还需要所有老师的平均值,包括那些尚未排名/他们的排名无效的人(在这种情况下他们的平均成绩为0,我必须像我一样计算他们的学生其他)。 我认为它是LEFT OUTER JOIN的东西,但我在网上看到的所有例子在FROM中只有两个表,我无法找到正确的语法。
SELECT teacher.tid,
tname,
AVG(grade) AS avgGrade,
COUNT(DISTINCT enrollment.sid) AS studCount
FROM rank,
teacher,
enrollment,
( SELECT rank.sid, rank.tid, MAX(date) AS maxDate
FROM rank
GROUP BY sid, tid
) lastGrades
WHERE teacher.tid=enrollment.tid
AND rank.tid=teacher.tid
AND rank.tid=lastGrades.tid
AND rank.sid=lastGrades.sid
AND rank.date=lastGrades.maxDate
AND valid = TRUE
GROUP BY teacher.tid, tname
答案 0 :(得分:1)
您可以使用子订阅查找每(teacher, student)
组合的最新排名。使用left join
来计算尚未排名的注册人数:
select t.tid
, t.tname
, avg(r.grade) as AverageRank
, count(distinct e.sid) as StudentCount
from teacher t
join enrollment e
on t.tid = e.tid
left join
rank r
on r.tid = t.tid
and r.sid = e.sid
and r.valid = true
and r.date =
(
select max(date)
from rank r2
where r2.sid = r.sid
and r2.tid = r.tid
and r2.valid = true
)
group by
t.tid
, t.tname
Example without data at SQL Fiddle.
桌子设计有点奇怪。你希望学生报名参加课程,而不是老师!