sql - 显示表格和给定日期范围中不存在的记录
问题描述
假设我有两个表 - 学生和学生出勤表。学生表显示有关学生的基本信息:
学生# | 名 | 姓 |
---|---|---|
201710 | 约翰 | 史密斯 |
201711 | 约翰 | 能源部 |
201712 | 安娜 | 西 |
201713 | 克里斯 | 镝 |
学生出勤表显示上课学生的 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 |
我的目标是还包括当天没有日志的学生的学生编号,我将用它来确定他们缺勤。
学生# | 日期 | 时间输入 | 暂停 |
---|---|---|---|
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 | 无效的 | 无效的 | 无效的 |
201710 | 2016-01-08 | 00:09:00.000 | 00:15:00.000 |
201711 | 无效的 | 无效的 | 无效的 |
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
使用该表来填充它Students
。
之后,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#
试试这个,如果您遇到任何错误,请告诉我们。
推荐阅读
- css - 行高和字体大小不一致的问题
- f# - 如何在 F# 中使用 sprintf 构建格式字符串?
- kotlin - 如何在 Kotlin 中构造具有具体类型参数的泛型对象?
- c# - 在 .NET Core API 3.0 中临时存储访问令牌
- lua - vlc 扩展 - 加载每个视频并选择字幕
- sql - 我有一个员工文件和一个地址文件(通过 seq #),我正在尝试获取员工的当前地址
- dm-script - 导入原始 DM 命令
- vb.net - VB.Net Com 端口读取
- python - 来自 DataFrame 的多级字典结构
- unity3d - 为什么我的 powerup 预制件可以工作,但实例化的克隆却不行?