2016-07-14 2 views
2

오라클 SQL에서 날짜 범위의 데이터 누락을 발견하는 방법 직원 번호 (EMPNO)과 참석 날짜를 포함내가 테이블 (출석)가

EMPNO DATE 
2  07/11/2016 
2  07/12/2016 
3  07/12/2016 
6  07/13/2016 
7  07/13/2016 

을 다음과 같이 직원의 출석을 포함 (날짜)

그리고 다른 테이블 (직원)의 직원이 사용하여 특정 날짜에 결석했다면 내가 찾을 수있는이

EMPNO NAME 
1  Musa 
2  Ali 
3  Khalid 
6  James 
7  Sara 

같은 예를 들어 회사의 모든 empolyees을 포함 이 코드

select empno 
from EMPLOYEES 
where empno not in (select empno 
       from ATTENDANCE 
       where date = '07/11/2016') 

내가이 쿼리

select empno 
from EMPLOYEES 
where empno not in (select empno 
       from ATTENDANCE 
       where date between '07/11/2016' and '07/13/2016' ) 

를 사용하려고
특정 범위 사이의 일에 결석 직원의 목록을 retreive 싶어하지만,이 날에없는 사람들을 줄 것이다 직원이 하루에 결석했다면 이 범위에있는 모든 일이 만이 retreive하지 않습니다 그것은

empno와 직원의 부재 날짜를 묻는 쿼리가 필요합니까?

업데이트 :이 작동하지만이 직원이 결석 날짜 에서 저를 포기하지 않을

select empno 
from EMPLOYEES 
where empno not in (select empno 
    from ATTENDANCE 
    group by empno 
    having count(empno) = to_date(' 07/09/2016','mm,dd,rrrr') - to_date('07/13/2016','mm,dd,rrrr')) 

언급SAGI으로도이 시도

+0

당신이 "주 일"을 구별해야합니까 또는 "근무일"과 "주말 또는 휴일"은 다른 한편으로는? 저는 일요일 (미국에서) 모든 직원이 "결석"하다고 생각합니다. – mathguy

답변

2

나는 쿼리가 EMPNO의 및 직원 이 결석 날짜을 retreive 할

당신이 사용 주어진 범위에서 모든 가능한 날짜를 생성해야 이러한 경우

예를 들어이 쿼리 :

SELECT date '2016-07-11' + level - 1 As "DATE" from dual 
CONNECT BY LEVEL <= date '2016-07-13' - date '2016-07-11' + 1; 

DATE    
----------------- 
16/07/11 00:00:00 
16/07/12 00:00:00 
16/07/13 00:00:00 

는 모든 가능한 쌍을 생성하기 위해 십자가를 조인 사용 : 날짜 + 직원당

SELECT e.empno, d."DATE" 
FROM (
    SELECT date '2016-07-11' + level - 1 As "DATE" from dual 
    CONNECT BY LEVEL <= date '2016-07-13' - date '2016-07-11' + 1 
) d 
CROSS JOIN empno e 

다음 기록을 기존 (만 존재하지 않는 쌍을 떠나 : EMPNO + 날짜) 필터 외부를 사용하여 가입하고 출력에서 ​​NULL 조건

SELECT e.empno, d."DATE" 
FROM (
    SELECT date '2016-07-11' + level - 1 As "DATE" from dual 
    CONNECT BY LEVEL <= date '2016-07-13' - date '2016-07-11' + 1 
) d 
CROSS JOIN EMPLOYEES e 
LEFT JOIN ATTENDANCE a 
ON (a.empno = e.empno AND a."DATE" = d."DATE") 
WHERE a."DATE" IS NULL 
order by 1,2 
0

별개의 선택 empno EMPLOYEES 전자, 왼쪽 조인 참가 aon e.empno = a.empno and e.date = a.date 여기서 a.empno NULL이다

+0

EMPLOYEES 테이블에 날짜가 없습니다. –