0

我有两张表员工和出勤,现在我想要日期明智地记录缺勤和在职员工。

喜欢: -

表 1:员工(EmpId、姓名)

表2:考勤(Empid、CheckInOutDateTime、状态(如--I/O))

(当员工不在考勤表中但需要记录时,记录将不可用)

现在我想要输出:

**EmpID    Name  Date          Status**

1         Emp1   06/11/2013     Persant

2         Emp2   06/11/2013     Absant

3         Emp3   06/11/2013     Persant

1         Emp1   06/12/2013     Persant

2         Emp2   06/12/2013     absant

3         Emp3   06/12/2013     absant
4

5 回答 5

1

试试这样...

Select Empid,EmpName,Date1,(
cASE WHEN EXISTS(
SELECT EMPID FROM Atten AT WHERE T.EMPID=AT.EMPID AND T.date1=AT.Chechout
) then 'Present' Else 'Absent' End )as Status
FROM
(
Select Empid,EmpName,Cast(Chechout as DATE)AS DATE1 from Emp a,(Select Distinct Chechout from Atten) b
) T

在 ms 访问-:

Select Empid,EmpName,Date1,(iif((SELECT Count(Empid)FROM Atten AT WHERE T.EMPID=AT.EMPID AND T.date1=DateVAlue(AT.Chechout))>0,'Absent','Present')) as Status
FROM(
Select Empid,EmpName,DateVAlue(Chechout) AS DATE1 from Emp a,(Select Distinct DateValue(Chechout) as Chechout  from Atten) b
 )T

SQL 小提琴演示

于 2013-06-11T06:12:53.770 回答
0

这是伪代码:

for each date as varDate
   query = "SELECT COUNT(*) AS cnt FROM Employee te LEFT JOIN Attendance ta ON te.Empid = ta.Empid WHERE ta.CheckInOutDateTime = " + varDate.ToString() + " GROUP BY te.Empid";

在显示上述查询的结果时,您可以这样做:

if Convert.ToInt32(dataRow("cnt")) > 0
   status = "Present";
else
   status = "Absent";
于 2013-06-11T07:10:47.343 回答
0

你可以试试这个:

SELECT A.EmpId,A.Name,B.CheckInOutDateTime,status = CASE WHEN B.STATUS = 'IN' THEN 'PRESENT'
ELSE 'ABSENT' END from Table1 A join Table2 B ON A.Empid=B.empid

于 2013-06-11T05:36:16.693 回答
0

您正在寻找的 SQL 功能称为外连接。您可能还想了解其他 SQL 功能。

如果出于某种原因您不能使用外连接,您可以使用子选择并计算出勤表中的记录,因为您只对给定日期的布尔值感兴趣,无论是否存在(计数> 0,员工是存在,计数 = 0,员工缺席)。

于 2013-06-11T05:36:21.170 回答
0

我可能会编写一个花哨的查询来获得您想要的结果,但它还需要一个包含每个可能日期的第三个表。

我认为在每天结束时添加缺席记录的计划任务会更容易。或者您可以提前让每个人都缺席,然后将记录更改为在员工出现时呈现。

于 2013-06-11T05:37:33.103 回答