我有两张桌子......
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天或以上,我也可以告诉我如何插入行
答案 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