我有下表spanishcourse
,代表西班牙语课程的学生成绩。这是一所每月开课的学校,学生可以在一年中随机开始和离开课程(分别为month in
和month 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。他们没有像这个例子那样考虑随机月份。
答案 0 :(得分:1)
您可以使用cross join
和left 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)
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