我的数据表结构如图

A表是提交记录的表
B表是姓名库表
我的需求是 按月显示没提交记录的人员(排除张1),不要带参数,按表a列出所有缺失人员
并且返回三列 姓名,年,月
如下图所示

这个10月份我需要在最外面where过滤,类似界面的下拉列表 控制,不要带参数
请给除完整的 sql语句 ,谢谢
我的数据表结构如图

A表是提交记录的表
B表是姓名库表
我的需求是 按月显示没提交记录的人员(排除张1),不要带参数,按表a列出所有缺失人员
并且返回三列 姓名,年,月
如下图所示

这个10月份我需要在最外面where过滤,类似界面的下拉列表 控制,不要带参数
请给除完整的 sql语句 ,谢谢
关注🕖上午好,题主!目前:🟢[在线]
📢参考通义千问、由郭老师整理提供!
📣今日诗号:水晶帘动微风起,满架蔷薇一院香。
-- 声明一个变量来存储月份,您可以根据需要修改这个值
DECLARE @TargetMonth int = 10;
SELECT
b.姓名,
YEAR(GETDATE()) AS 年, -- 获取当前年份
@TargetMonth AS 月 -- 使用声明的月份变量
FROM
B表 b
LEFT JOIN
A表 a ON b.姓名 = a.姓名 AND MONTH(a.提交时间) = @TargetMonth
WHERE
a.姓名 IS NULL -- 左连接后,如果A表中没有匹配的记录,则姓名为NULL
AND b.姓名 <> '张1' -- 排除张1
ORDER BY
b.姓名;
代码解释:
DECLARE @TargetMonth int = 10;: 声明一个名为 @TargetMonth 的变量,并将其设置为 10,代表要查询的月份。您可以根据需要修改这个值。SELECT b.姓名, YEAR(GETDATE()) AS 年, @TargetMonth AS 月:
b.姓名: 从 B表 中选择姓名。YEAR(GETDATE()) AS 年: 使用 GETDATE() 函数获取当前日期,然后使用 YEAR() 函数提取年份。@TargetMonth AS 月: 直接使用声明的月份变量作为结果中的月份。FROM B表 b LEFT JOIN A表 a ON b.姓名 = a.姓名 AND MONTH(a.提交时间) = @TargetMonth:
LEFT JOIN 将 B表 和 A表 连接起来。 LEFT JOIN 确保即使在 A表 中没有匹配的记录,B表 中的所有记录也会被返回。b.姓名 = a.姓名 AND MONTH(a.提交时间) = @TargetMonth,这意味着只有当姓名相同且提交时间在目标月份内的记录才会被匹配。WHERE a.姓名 IS NULL AND b.姓名 <> '张1':
a.姓名 IS NULL: 筛选出在 A表 中没有找到匹配记录的 B表 记录,这些记录表示没有提交记录的人员。b.姓名 <> '张1': 排除姓名为 "张1" 的记录。ORDER BY b.姓名: 按照姓名对结果进行排序。如何使用:
@TargetMonth 的值修改为您想要查询的月份。这将返回一个包含三列的结果集:姓名、年份和月份。结果将显示在所选月份没有提交记录的所有人员(排除张1)。