SQL查询以空值显示员工出勤和缺勤情况

时间:2019-11-19 10:23:50

标签: sql

我想写一个查询来显示员工一个月的出勤情况。我有两个表:Emp和Checkinout

emp table: Emp_ID, Name
Checkinout: ID, Emp_ID_Fk, checkin, checkout

我想要这样的结果:

date, emp.name, checkin, checkout
2019-10-17, John, 2019-10-17, 2019-10-17
2019-10-18, John , null , null <- Absent
2019-10-19, John, 2019-10-19, 2019-10-19
2019-10-17, Mike,2019-10-17, 2019-10-17
2019-10-18, Mike, 2019-10-18,2019-10-18
2019-10-19, Mike , null, null <- absent

这就是我的想法:

with dated as (
select  distinct convert(varchar,checkin,112) Day_Per_Month
from checkinout
where month(checkin) =10)

select convert(date,Day_Per_Month) as Date, emp.name as Employee_Name
from dated 
left join checkinout on convert(varchar,checkin, 112) = Day_Per_Month 
left join emp on emp.emp_id = checkinout.Emp_ID_Fk

注意:当emp不签入时,系统不会在签入表中插入任何记录。

1 个答案:

答案 0 :(得分:0)

但是您没有指定任何DBMS,所以我尝试使用 Sql Server 2012

  • 首先,您没有在CheckInOut表中缺少员工的条目,因此您需要为此生成相关日期。因此,通过使用 CTE ,您可以按照答案所示进行操作。 日期从'2019-10-17'2019-10-20,您可以根据需要进行更改。
  • 使用 CASE SUB QUERY ,您可以过滤出特定日期的员工。
  • 最后通过使用 JOIN (在这里我使用旧联接,因为数据cte和雇员之间没有关系)可以提取所需的输出。

尝试以下查询:

;With Cte_Date AS
(
SELECT CONVERT(DATE,'2019-10-17') AS MonthDate
UNION ALL
SELECT DATEADD(dd,+1,MonthDate) AS MonthDate FROM Cte_Date WHERE MonthDate<=CONVERT(DATE,'2019-10-19')
)

SELECT e.Emp_Id,
e.Name,
d.MonthDate,
CASE WHEN  EXISTS (SELECT 1 FROM CheckInOut AS c WHERE c.CheckIn=d.MonthDate AND c.Emp_Id=e.Emp_Id) THEN d.MonthDate ELSE NULL END AS CheckIn,
CASE WHEN  EXISTS (SELECT 1 FROM CheckInOut AS c WHERE c.CheckOut=d.MonthDate AND c.Emp_Id=e.Emp_Id) THEN d.MonthDate ELSE NULL END AS CheckOut
FROM Cte_Date AS d, Employee AS e
OPTION (MAXRECURSION 0);

DEMO

注意:语法可能因您的DBMS而异

相关问题