向表中添加缺少的信息? (考虑随机开始和结束月份)

时间:2014-07-11 15:05:13

标签: sql postgresql

我有下表spanishcourse,代表西班牙语课程的学生成绩。这是一所每月开课的学校,学生可以在一年中随机开始和离开课程(分别为month inmonth out列)。事实上这些学生中的一些人在几个月内缺席,当他们缺席时,成绩为0.问题是当学生缺席时month没有将成绩显示为0(专栏{{1} })。

grades

我需要的输出,现在是Rick的一小部分:

month in    month out   month   student grades  
3           9           3       John    10  
3           9           5       John    8   
3           9           6       John    4   
3           9           7       John    3   
3           9           9       John    7   
2           7           2       Mary    9   
2           7           3       Mary    2   
2           7           6       Mary    6   
2           7           7       Mary    9   
1           3           1       Jane    8   
1           3           2       Jane    7   
1           3           3       Jane    5   
6           10          6       Rick    9   
6           10          8       Rick    1   
6           10          10      Rick    3   

结论:我只需要添加从学生开始到结束的缺失时期。考虑到Rick的例子,我们只增加了7个月和9个等级为0级。有些人可以帮助我吗?

PS:我已经看到了其他一些已回答的问题。他们是相反的,因为他们认为所有数据从1开始到n。他们没有像这个例子那样考虑随机月份。

2 个答案:

答案 0 :(得分:1)

您可以使用cross joinleft outer join执行此操作。 cross join生成学生和月份之间的所有组合。 left outer join引入匹配记录的数据。不匹配的记录的成绩为0

以下假设某个学生在某个地方每个月都有一个成绩:

select s.month_in, s.month_out, m.month, s.student,
       coalesce(sc.grades, 0) as grades
from (select distinct student, month_in, month_out from spanishcourse sc) s cross join
     (select distinct month from spanishcourse sc) m left outer join
     spanishcourse sc
     on sc.student = s.student and sc.month = m.month;

答案 1 :(得分:1)

SQL Fiddle

select s.month_in, s.month_out, month, student, coalesce(grades, 0)
from
    spanishcourse sc
    right join
    (
        select distinct
            student, month_in, month_out,
            generate_series(month_in, month_out, 1) as month
        from spanishcourse
    ) s using (student, month)
order by student, month