SQL Server - 如何只在select之间的其他属性时加入

Jon*_*Dog 5 sql sql-server

我正在尝试查询以显示学生的出勤记录.这些是我的表.

在此输入图像描述

这是我到目前为止开始的......

我正在将studentId(StudentCalendar)列表与学校开放日期(DateCollection)匹配,然后记录错过的天数(出勤率).

我最终得到这样的东西..

 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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我现在有一份学生名单,每天都有学校开放.我的问题是并非每个学生都注册了整个学年.

有没有办法让我只能将学生列表(StudentCalendar)与学校开放日期(DateCollection)匹配,当它在每个学生的学生日历startDate和endDate(日历)中给出的范围内?

像这样的东西..

在此输入图像描述

Ron*_*ith 2

这应该适合你:

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
    INNER JOIN [dbo].[Attendance] a ON a.dateOccurred = dc.[date]
           AND a.personId = s.personId
           AND dc.[date] BETWEEN s.startDate AND isnull(s.endDate,'99991231')
Run Code Online (Sandbox Code Playgroud)