明天有时间给你写个脚本
今天抽了点时间写这个脚本,有问题可以留言
;WITH temp_table1 AS(
SELECT
ROW_NUMBER() OVER(ORDER BY ID,attendancedate,attendancetime) num,
ID,
name,
CardNo,
Dept,
attendancedate,
attendancetime,
attendancearea,
ROW_NUMBER() OVER(PARTITION BY ID,attendancedate ORDER BY attendancetime) row
FROM temp_table
),mid_table AS(
SELECT
ID,
row,
CASE WHEN MAX(row) OVER(PARTITION BY ID,attendancedate)%2=0 THEN attendancearea ELSE N'异常' END attendancearea
FROM temp_table1
)
,temp_table2 AS(
SELECT
a.ID,
a.name,
a.CardNo,
a.Dept,
a.attendancedate,
a.attendancetime in_attendancetime,
b.attendancetime out_attendancetime,
a.attendancearea in_attendancearea,
b.attendancearea out_attendancearea,
a.row
FROM temp_table1 a
LEFT JOIN temp_table1 b ON a.num=b.num-1 AND b.ID = a.ID
),result_table AS(
SELECT
temp_table2.*,
CASE WHEN in_attendancearea=N'门卫入口'
THEN DATEDIFF(MI,in_attendancetime,out_attendancetime)
ELSE DATEDIFF(MI,out_attendancetime,in_attendancetime)
END work_time
FROM temp_table2
LEFT JOIN mid_table ON mid_table.ID = temp_table2.ID AND mid_table.row = temp_table2.row
WHERE attendancearea=N'异常' OR(out_attendancearea IS NOT NULL AND attendancearea<>N'异常')
)
SELECT
ID,
attendancedate,
ISNULL(RTRIM(CONVERT(DECIMAL(18,2),SUM(work_time)/60.00)),N'异常') work_time
FROM result_table
WHERE ISNULL(work_time,0)>=0
GROUP BY ID,result_table.attendancedate
原表数据:
结果数据: