陷入Attendence查询问题

时间:2016-08-23 16:40:38

标签: sql oracle plsql oracle11g oracle10g

我有两张桌子......

CREATE TABLE EMP22( EMP_NO  NUMBER(12),TIME_STAMP  TIMESTAMP, IN_OUT_FLAG VARCHAR2(3) ,Emp_name varchar2(25),Department_name varchar2(25),presence_Type varchar2(20));

Create table employee (emp_no number(10),emp_name varchar2(30),Department_name varchar2(20),Hire_date date,salary number(10),Commission_pct number(10),job_id varchar2(10));

显示当前员工我正在使用此查询

SELECT DISTINCT B.EMP_NAME, B.DEPARTMENT_NAME, B.EMP_NO, B.DATE_WORKED, B.IN_OUT_FLAG,  
        MIN(TO_CHAR(B.TIME_IN,  'HH:MI:SS AM')) OVER (PARTITION BY B.EMP_NO, B.DATE_WORKED)        TIME_IN,   
        MAX(TO_CHAR(B.TIME_OUT, 'HH:MI:SS AM')) OVER (PARTITION BY B.EMP_NO, B.DATE_WORKED)        TIME_OUT,   
      (SUM(B.TIME_WORKED)                      OVER (PARTITION BY B.EMP_NO, B.DATE_WORKED)) * 24  HOURS_WORKED   
FROM (SELECT A.EMP_NAME, A.DEPARTMENT_NAME, A.IN_OUT_FLAG, A.EMP_NO,   
            LEAD(A.TIME_STAMP, 0) OVER (PARTITION BY A.EMP_NO, TO_CHAR(A.TIME_STAMP, 'DD-MON-YYYY') ORDER BY A.EMP_NO, A.TIME_STAMP) TIME_IN,   
            LEAD(A.TIME_STAMP, 1) OVER (PARTITION BY A.EMP_NO, TO_CHAR(A.TIME_STAMP, 'DD-MON-YYYY') ORDER BY A.EMP_NO, A.TIME_STAMP) TIME_OUT,   
            LEAD(A.TIME_STAMP, 1) OVER (PARTITION BY A.EMP_NO, TO_CHAR(A.TIME_STAMP, 'DD-MON-YYYY') ORDER BY A.EMP_NO, A.TIME_STAMP) -   
            LEAD(A.TIME_STAMP, 0) OVER (PARTITION BY A.EMP_NO, TO_CHAR(A.TIME_STAMP, 'DD-MON-YYYY') ORDER BY A.EMP_NO, A.TIME_STAMP) AS TIME_WORKED, A.DATE_WORKED   
      FROM(SELECT  EMP_NAME, DEPARTMENT_NAME, EMP_NO, TO_DATE(TO_CHAR(TIME_STAMP,'DD-MON-YYYY HH24:MI'),'DD-MON-YYYY HH24:MI') AS TIME_STAMP, IN_OUT_FLAG, TO_CHAR(TIME_STAMP, 'DD-MON-YYYY') AS DATE_WORKED   
          FROM EMP22) A) B   
WHERE B.IN_OUT_FLAG = 'IN' AND B.DATE_WORKED BETWEEN :P_FROM_DATE AND :P_TO_DATE

结果显示如下

  ID_Emp|Name  |Date        |TimeIn | TimeOut  |Hours
   -------------------------------------------------------
   11  |Jonh  |14/05/2014   |8:16   |13:35  |5:19
   11  |Jonh  |14/05/2014   |17:23  |21:09  |3:46
   12  |Elizabe |14/05/2014   |14:06  |22:39  |8:33
   13  |Jimmy  |14/05/2014   |8:00   |17:12  |9:12

我想添加一个更多列,其中Presence_type我可以向用户显示休假或现场......

ID_Emp|Name  |Date        |TimeIn | TimeOut  |Hours              presence_type
   ------------------------------------------------------------------------
   11  |Jonh  |14/05/2014   |8:16   |13:35  |5:19                    Present
   11  |Jonh  |14/05/2014   |17:23  |21:09  |3:46                    Present
   12  |Elizabe |14/05/2014   |14:06  |22:39  |8:33                  Present
   13  |Jimmy  |14/05/2014   |8:00   |17:12  |9:12                   Present

如果用户休假或休假45天或以上,我也可以告诉我如何插入行

1 个答案:

答案 0 :(得分:0)

SELECT DISTINCT B.EMP_NAME, B.DEPARTMENT_NAME, B.EMP_NO, B.DATE_WORKED, B.IN_OUT_FLAG,  
        MIN(TO_CHAR(B.TIME_IN,  'HH:MI:SS AM')) OVER (PARTITION BY B.EMP_NO, B.DATE_WORKED)        TIME_IN,   
        MAX(TO_CHAR(B.TIME_OUT, 'HH:MI:SS AM')) OVER (PARTITION BY B.EMP_NO, B.DATE_WORKED)        TIME_OUT,   
      (SUM(B.TIME_WORKED)                      OVER (PARTITION BY B.EMP_NO, B.DATE_WORKED)) * 24  HOURS_WORKED,
       'Preset' as Presence_type
FROM (SELECT A.EMP_NAME, A.DEPARTMENT_NAME, A.IN_OUT_FLAG, A.EMP_NO,   
            LEAD(A.TIME_STAMP, 0) OVER (PARTITION BY A.EMP_NO, TO_CHAR(A.TIME_STAMP, 'DD-MON-YYYY') ORDER BY A.EMP_NO, A.TIME_STAMP) TIME_IN,   
            LEAD(A.TIME_STAMP, 1) OVER (PARTITION BY A.EMP_NO, TO_CHAR(A.TIME_STAMP, 'DD-MON-YYYY') ORDER BY A.EMP_NO, A.TIME_STAMP) TIME_OUT,   
            LEAD(A.TIME_STAMP, 1) OVER (PARTITION BY A.EMP_NO, TO_CHAR(A.TIME_STAMP, 'DD-MON-YYYY') ORDER BY A.EMP_NO, A.TIME_STAMP) -   
            LEAD(A.TIME_STAMP, 0) OVER (PARTITION BY A.EMP_NO, TO_CHAR(A.TIME_STAMP, 'DD-MON-YYYY') ORDER BY A.EMP_NO, A.TIME_STAMP) AS TIME_WORKED, A.DATE_WORKED   
      FROM(SELECT  EMP_NAME, DEPARTMENT_NAME, EMP_NO, TO_DATE(TO_CHAR(TIME_STAMP,'DD-MON-YYYY HH24:MI'),'DD-MON-YYYY HH24:MI') AS TIME_STAMP, IN_OUT_FLAG, TO_CHAR(TIME_STAMP, 'DD-MON-YYYY') AS DATE_WORKED   
          FROM EMP22) A) B   
WHERE B.IN_OUT_FLAG = 'IN' AND B.DATE_WORKED BETWEEN :P_FROM_DATE AND :P_TO_DATE
union
select b.emp_Name, 
    B.EMP_NAME, B.DEPARTMENT_NAME, B.EMP_NO, Null as DATE_WORKED,  Null as IN_OUT_FLAG etc.. make sure the columns match with the first query   
    'On Leave' as Presence_type from 
(hack your query to get the on leave employees) b where emploees are on leave
union
select b.emp_Name, 
    B.EMP_NAME, B.DEPARTMENT_NAME, B.EMP_NO, Null as DATE_WORKED,  Null as IN_OUT_FLAG etc.. make sure the columns match with the first query   
    'On Leave' as Presence_type from 
(hack your query to get the on vacation employees) b where  emploees are on vacation