向缺少的字段添加0或null

时间:2013-12-15 21:24:41

标签: sql postgresql

我有以下表格:

学生(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

1 个答案:

答案 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.

桌子设计有点奇怪。你希望学生报名参加课程,而不是老师!