显示表格和给定日期范围中不存在的记录

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

【讨论】:

嗨!非常感谢,我认为在两个表之间使用左连接就足够了。将对此进行更多研究并牢记这一点! :) 非常感谢您的帮助!

以上是关于显示表格和给定日期范围中不存在的记录的主要内容,如果未能解决你的问题,请参考以下文章

即使数据库中不存在,也要显示记录

表格/查询中不存在MS Access Combobox的值

连接sql表以选择连接表中不存在的记录[重复]

仅当 Access 2007 中不存在时才添加记录

如何获取另一个表中不存在的表的记录?

蒙德里安的日期范围