0

我正在尝试创建一个链接到 2 个不同的 MS SQL 数据库的制造企业的劳动效率报告。

“数据库 A”包含有关员工在轮班时所做的事情的信息。

“数据库 B”包含有关员工何时打卡或下班以获取工资单信息的信息。

我想报告的比较之一是员工登录工作的总时间与他们在大楼打卡的总时间。数据与员工编号相关。主报表链接到数据库 A 并按“员工姓名”分组,在组页脚中,有一个链接到数据库 B 的子报表,员工姓名作为参数传递。

我的问题是数据库 B 记录打卡的方式。我正在使用 SQL 命令来收集数据:

SELECT 
tws.date_and_time
, CONVERT(date, tws.date_and_time) AS 'Date'
,te.first_name
, te.last_name
, concat(te.first_name,' ', te.last_name) AS 'ConcatName'
, CASE WHEN tws.flag IN (1,3) THEN 1 ELSE 0 END as manual_adjustment
, ROW_NUMBER() OVER (PARTITION BY tw.date_and_time ORDER BY tws.date_and_time ASC) AS swipe_number
, ROW_NUMBER() OVER (PARTITION BY tw.date_and_time ORDER BY tws.date_and_time ASC) % 2 AS in_swipe

FROM temployee te
INNER JOIN twork tw
ON te.employee_id = tw.employee_id AND tw.type = 1000
INNER JOIN twork_swipe tws
on tw.work_id = tws.work_id

“swipe_number”详细说明了该记录在该时间段内的滑动次数(例如,第 1、2、3 等)

如果这是员工打卡,“in_swipe”显示 1,如果员工打卡,则显示 0。

我正在对日期的子报告进行分组。

如果员工在同一天打卡一次,这是相对简单的,但我正在努力弄清楚如何解释员工在轮班期间是否多次打卡(例如休息),或者如果一名员工一天上班,另一天下班(例如夜班)。

我需要总结员工打卡的总时间,所以我需要评估一天中的第一个时钟是否是“刷卡”,(swipe_number = 1 AND in_swipe = 1)如果不是,它不应该是记录为 swipe_number 2 和 1 之间的差异,它应该是从一天的开始 (00:00:0000) 到 swipe_number = 1,因为这表明员工自午夜以来一直在那里。

同样,如果一天的最后一个(或唯一一个)“swipe_number”是“in swipe”,则时间应记录在该时间与 23:59:5999 之间。

除此之外,我需要找到滑动数字 = 2 和 1、4 和 3、6 和 5 等的日期时间字段之间的时间(没有固定的滑动次数)。

这可以在公式中动态处理吗?

4

0 回答 0