显示表格和给定日期范围中不存在的记录
Posted
技术标签:
【中文标题】显示表格和给定日期范围中不存在的记录【英文标题】:Display records that are not present in a table and a given date range 【发布时间】:2021-10-23 15:04:09 【问题描述】:假设我有两个表 - 学生和学生出勤表。 Student 表显示有关学生的基本信息:
Student# | FirstName | LastName |
---|---|---|
201710 | John | Smith |
201711 | John | Doe |
201712 | Anna | Sy |
201713 | Chris | Dy |
虽然学生出勤表显示学生上课的时间进出时间:
Student# | Date | TimeIn | TimeOut |
---|---|---|---|
201710 | 2016-01-06 | 00:09:00.000 | 00:15:00.000 |
201711 | 2016-01-06 | 00:09:10.000 | 00:15:00.000 |
201712 | 2016-01-06 | 00:09:05.000 | 00:15:00.000 |
201713 | 2016-01-06 | 00:09:00.000 | 00:15:00.000 |
201710 | 2016-01-07 | 00:09:00.000 | 00:15:00.000 |
201711 | 2016-01-07 | 00:09:10.000 | 00:15:00.000 |
201712 | 2016-01-07 | 00:09:05.000 | 00:15:00.000 |
201710 | 2016-01-08 | 00:09:00.000 | 00:15:00.000 |
201712 | 2016-01-08 | 00:09:10.000 | 00:15:00.000 |
201713 | 2016-01-08 | 00:09:05.000 | 00:15:00.000 |
我的目标是还包括当天没有日志的学生的学生编号,我将使用它来确定他们是否缺席。
Student# | Date | TimeIn | TimeOut |
---|---|---|---|
201710 | 2016-01-06 | 00:09:00.000 | 00:15:00.000 |
201711 | 2016-01-06 | 00:09:10.000 | 00:15:00.000 |
201712 | 2016-01-06 | 00:09:05.000 | 00:15:00.000 |
201713 | 2016-01-06 | 00:09:00.000 | 00:15:00.000 |
201710 | 2016-01-07 | 00:09:00.000 | 00:15:00.000 |
201711 | 2016-01-07 | 00:09:10.000 | 00:15:00.000 |
201712 | 2016-01-07 | 00:09:05.000 | 00:15:00.000 |
201713 | NULL | NULL | NULL |
201710 | 2016-01-08 | 00:09:00.000 | 00:15:00.000 |
201711 | NULL | NULL | NULL |
201712 | 2016-01-08 | 00:09:10.000 | 00:15:00.000 |
201713 | 2016-01-08 | 00:09:05.000 | 00:15:00.000 |
感谢您的帮助!
【问题讨论】:
使用日历表,CROSS JOIN
到你的Student
表,然后LEFT JOIN
到你的Attendance
表。
请向我们展示您的尝试
【参考方案1】:
首先您需要创建一个日历表来填充所需的日期,然后使用Students
表在CROSS JOIN
它。
之后,将StudentsAttendance
表与结果集左连接。
日历表:
CREATE TABLE #Cal(AttDate DATE)
DECLARE @MinDate DATE = '2016-01-06', @MaxDate DATE = '2016-01-08'
WHILE @MinDate<=@MaxDate
BEGIN
INSERT INTO #Cal
SELECT @MinDate
SET @MinDate = DATEADD(DAY,1,@MinDate)
END
此表包含以下日期。
AttDate
2016-01-06
2016-01-07
2016-01-08
现在执行查询
SELECT D.Student#,D.AttDate,SA.TimeIn, SA.TimeOut
FROM(
SELECT S.Student#, AttDate
FROM #Cal C
CROSS JOIN Student S
)D
LEFT JOIN Student_Attendance SA ON SA.Student# = D.Student# AND SA.Date = D.AttDate
ORDER BY D.AttDate,D.Student#
试试这个,如果您遇到任何错误,请告诉我们。
SQLFiddle
【讨论】:
嗨!非常感谢,我认为在两个表之间使用左连接就足够了。将对此进行更多研究并牢记这一点! :) 非常感谢您的帮助!以上是关于显示表格和给定日期范围中不存在的记录的主要内容,如果未能解决你的问题,请参考以下文章