SQL Server查询 - 使用完整的可能值列表连接各个值

时间:2014-05-27 19:18:18

标签: sql sql-server

我想不出一个非常好的标题,所以让我解释一下。

我列出了学生缺席的日子(dbo.Attendance)。

absent

我还有学校开放的日子清单(dbo.DateCollection)。

school days

我的问题是...... 是否有一些原因让我加入/合并两个表到一个列表,显示每个学生每天出席的情况?像这样......

任何帮助或指示都将受到赞赏!!

enter image description here

2 个答案:

答案 0 :(得分:3)

是。您可以通过加入表格来完成此操作。在这种情况下,这有点棘手,因为你必须在所有日子里为所有学生开始一行,然后看看学生是否在场。我假设您有一个Students表:

select s.personid, c.calendarid, c.date, coalesce(a.absentMinutes, 0) as absentMinutes
from Calendar c cross join
     Students s left outer join
     Attendance a
     on a.dateOccurred = c.date and
        a.personid = s.personid;

如果您没有学生表,那么您就遇到了问题。您只能报告Attendance表中的学生。你可以这样做:

select s.personid, c.calendarid, c.date, coalesce(a.absentMinutes, 0) as absentMinutes
from Calendar c cross join
     (select distinct personid from Attendance) s left outer join
     Attendance a
     on a.dateOccurred = c.date and
        a.personid = s.personid;

答案 1 :(得分:0)

感谢您的所有输入。

我最后还为学生们使用了一张桥牌桌。 这就是我为我工作的原因。

SELECT s.personid,
        dc.calendarid, 
        dc.[date], 
        coalesce(absentMinutes,0) AS absentMinutes
  FROM [dbo].[StudentCalendar] s INNER JOIN 
        [dbo].[DateCollection] dc ON s.calendarId=dc.calendarId LEFT JOIN
        [dbo].[Attendance] a ON a.dateOccurred=dc.[date] AND a.personId=s.personId