在 SQL 中,我有一张打卡表,显示当天谁在各自的轮班中打卡上班,以及谁在当天的轮班中打卡下班。每个打卡上班的人都应该打卡下班,但我们遇到了一个问题,人们打卡上班却忘记了打卡下班。我想编写一个查询,检查签到的人是否没有签下,并返回所有忘记签下的人的列表,以及他们最后一个打卡的人。我不想制作一个表格来跟踪谁应该打卡上班和下班,因为有人可能会错过一天,或者休假一天等 - 但他们都知道打卡上班,所以我想我可以我的检查以此为基础。一些示例数据如下:
DECLARE @PunchCards TABLE
(
[Name] VARCHAR(20),
[Shift] VARCHAR(30)
);
--John & Kate have clocked in & out properly, Doug forgot to clock out
INSERT INTO @PunchCards
(Name, Shift)
VALUES
('John', -- Name - varchar(20)
'Start Day Shift' -- Shift - varchar(30)
),
('Doug', -- Name - varchar(20)
'Start Day Shift' -- Shift - varchar(30)
),
('John', -- Name - varchar(20)
'End Day Shift' -- Shift - varchar(30)
),
('Kate', -- Name - varchar(20)
'Start Night Shift' -- Shift - varchar(30)
),
('Kate', -- Name - varchar(20)
'End Night Shift' -- Shift - varchar(30)
)
根据该数据,我的查询应该返回一行 - Name = Doug,Shift = Start Day Shift。
我对如何解决这个问题感到困惑 - 我的工作想法是使用 CASE WHEN 并在 case 语句中执行子查询,将我当前的 SELECT 与子查询进行比较,看看我当前的班次是否为“开始日”轮班”或“开始夜班”,以确保无论是哪一个,都有其各自的“结束日班”或“结束夜班”。即便如此,我仍然在思考如何分解这个问题来解决它。我对如何解决这个问题有什么想法吗?谢谢。
您可以使用
not exists
子句来表示没有结束班次:
select Name
from @PunchCards pc1
where shift like 'Start % Shift'
and not exists
(
select *
from @PunchCards pc2
on pc1.name = pc2.name
and pc2.shift like replace(pc1.shift, 'Start', 'End')
)