【问题标题】:Query for absent and present Employee查询缺勤和在职员工
【发布时间】:2013-06-11 05:24:55
【问题描述】:

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

喜欢:--

表 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

【问题讨论】:

    标签: c# sql wpf c#-4.0 ms-access-2007


    【解决方案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
    

    在毫秒访问-:

    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 Fiddle Demo

    【讨论】:

    • @JasRajBishnoi 现在尝试我忘记从访问查询中删除结束,我编辑了它现在尝试
    • 我已经从查询中删除了 END 但仍然抛出语法错误(指示状态)...
    • @JasRajBishnoi try is null inplace of exists
    • @AmitWe 在“缺席”之后缺少“)”。感谢您的快速回复和解决方案。下面是完整的查询: Select distinct empid,empName,Date1,( iif( EXISTs( SELECT empID FROM Atten AT WHERE T.empID=AT.empID AND T.date1=format(AT.Chechout,'mm/dd/yyyy') ) , 'Present' , 'Absent' )) as Status FROM ( Select empid,empName,format(Chechout,'mm/dd/yyyy') AS DATE1 from emp a,(Select Distinct Chechout from Atten ) b ) T order by日期1
    • @JasRajBishnoi 欢迎....感谢您发现非常小的错误...我按照您的建议编辑了我的答案...
    【解决方案2】:

    您正在寻找的 SQL 功能称为outer join。您可能还想了解其他 SQL 功能。

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

    【讨论】:

    • 他同时为所有日期执行此操作,这需要一个包含所有日期的表格。
    • 在实践中,不同的日期列可能就足够了,因为当 everyone 缺席时将没有日期(就像薛定谔办公室之类的那样),但我会也像你描述的那样实现它。
    【解决方案3】:

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

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

    【讨论】:

    • 嗨,汤姆,我们不可能为缺席员工维护第三张表(对于一个字段(日期))。主要查询是按日期显示所有员工(缺席或在场)。
    • 不,如果您想要一个严格的 SQL 解决方案,则每个日期都有第三张表。我的建议是将出席和缺席记录写入出勤表。
    【解决方案4】:

    你可以试试这个:

    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

    【讨论】:

    • 如果员工缺勤,则没有可链接的记录。
    • 但是在结果集中你会发现缺勤员工的NULL值..
    • 艾哈迈德,您不会得到任何空值,因为没有日期可以提供记录。如果你不相信我,你自己测试一下。
    【解决方案5】:

    这是伪代码:

    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";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多