2

我正在使用 SQL Server 2008,我有 4 个表StudentAbsentees, Students, StudentSectionsSections

StudentAbsentees表格中,我存储了studentId在特定日期缺席的(仅限缺席者),例如,

    StudentId     Time     Date        
   -----------   ------   ------
       1         10:00    2012-04-13

并在StudentSections我将其存储studentId在特定部分中,例如

 StudentId    SectionId
   ----------   ------------
      1              1
      2              1
      3              1

Students表格中我存储学生详细信息,同样在Sections表格中我有部分详细信息,如该部分的名称和容量。

我需要加入这些表格并显示学生在特定日期是否在场/缺席......结果应该是

StudentId    Status
---------    ------
    1         Absent
    2         Present
    3         Present

我可以从这些表格中获取缺席者名单,我不知道如何显示他们是否在场/缺席......有人可以在这里帮助我吗

4

3 回答 3

3
select * from (
   select s.id, 
          case 
              when sa.date = '2012-01-01'
              then 'absent'
              else 'present' 
          end as status,
          ROW_NUMBER() OVER (PARTITION BY s.id ORDER BY CASE WHEN sa.date = '2012-01-01' THEN 1 ELSE 2 END) AS RowNumber
   from students s
   left outer join studentabsentees sa on s.id = sa.studentid
)
as a where a.RowNumber = 1
于 2012-04-13T14:44:38.127 回答
1

您查询显示某一天所有学生的状态如下所示:

select s.id, s.name, a.status
from student s
left join studentabsentees a on s.id = a.studentid
where a.date = ?

显然你必须提供一个日期。

注意:您的问题在标题中使用“内部联接”。我认为左边更合适,因为它会显示给所有学生。但是,如果您真的只想要那些在缺席者表中有记录的人,那么您可以将查询中的单词“left”更改为“inner”。

注意2:我的查询假设一个状态字段。如果您没有,请查看 juergen d 的答案。

于 2012-04-13T14:43:07.940 回答
1

不需要连接,您可以使用集合运算符:

SELECT StudentID, 'Absent' 
FROM StudentsAbsentees
WHERE [date] = ...
UNION 
(
SELECT StudentID, 'Present'
FROM Students
EXCEPT
SELECT StudentID, 'Present' 
FROM StudentsAbsentees
WHERE [date] = ...
)

您可以通过将它们选择为常量来显示“存在”和“不存在”。很容易得到所有缺席学生的名单。然后将它与所有现在的学生联合起来。现在的学生是通过获取完整的学生列表并在缺失的学生上使用 except 运算符来找到的。但是在这部分中,请确保您选择缺席学生作为出席者,以便他们从您刚刚创建的姓名旁边出现在场的所有学生列表中很好地减去。

于 2012-04-13T14:46:52.713 回答