如何用sql查询员工一天内连续六次考勤数据

img


如何用sql查询员工一天内连续六次考勤数据,将纵向考勤数据变为横向

要查询员工在一天内连续六次的考勤数据并将纵向考勤数据变为横向,你可以使用SQL中的窗口函数和子查询来实现。以下是一个示例查询语句:

SELECT
  employee_id,
  date,
  SUM(CASE WHEN check_in_out_time = 'Check In' THEN 1 ELSE 0 END) AS check_in_count,
  SUM(CASE WHEN check_in_out_time = 'Check Out' THEN 1 ELSE 0 END) AS check_out_count
FROM
  attendance
WHERE
  date = '2023-07-18'
  AND employee_id = 1
GROUP BY
  employee_id,
  date
ORDER BY
  employee_id,
  date

在上述查询中,我们假设有一个名为"attendance"的表,其中包含员工ID、日期和签到/签出时间("check_in_out_time")列。我们使用SUM和CASE函数来计算每个员工在指定日期内连续六次的签到和签出次数。通过使用SUM和CASE函数,我们可以将纵向数据转换为横向表示。

请注意,上述查询只是一个示例,你需要根据你的实际数据表结构和列名进行相应的调整。另外,你可以根据需要修改日期和员工ID的条件来查询特定的员工和日期范围。

【以下回答由 GPT 生成】

可以使用窗口函数来解决这个问题。以下是一个使用SQL查询语句的示例,用于找出员工在同一天内连续六次以上的考勤记录:

WITH cte AS (
    SELECT 
        employee_id, 
        attendance_date, 
        attendance_time, 
        ROW_NUMBER() OVER(PARTITION BY employee_id, attendance_date ORDER BY attendance_time) AS rn
    FROM 
        attendance_table
)
SELECT 
    employee_id, 
    attendance_date, 
    attendance_time
FROM 
    cte
WHERE 
    rn >= 6
ORDER BY 
    employee_id, attendance_date, attendance_time;

在这个查询语句中,我们首先使用了ROW_NUMBER()函数将每个员工在每天的考勤记录按照时间排序,并为其分配一个行号。然后,我们使用PARTITION BY子句来确保按照员工ID和考勤日期进行分组。最后,我们使用WHERE子句筛选行号大于等于6的记录,即表明员工在同一天内有连续六次以上的考勤记录。

请将表名attendance_table替换为你实际的表名,然后运行查询语句即可。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^