2017-12-18 10 views
0

직원이 급여 그룹을 입력했을 때 effective date을 찾아야합니다. 이 날짜는 고용 일자, 갱신 날짜 또는 이전 날짜 중 늦은 날짜에 발생한 것입니다. 내가 뭘하고 싶은지 가장 최근의 효과적인 일 where C1.ACTION=('XFR') AND C1.PAYGROUP=A.PAYGROUP의 임시 테이블을 만들 때, 그 테이블에 동료가 not 일 때, most recent hire date을 주겠다고 생각합니다.유효 일자 직원 급여 그룹

  • 는가가 최근 대여 날짜는

전체 직원의 기록을이다 스택 개인 정보

  • C의 최고입니다 스택 직원 DTA
  • B의 최고입니다

    CASE WHEN A.HIRE_DT<=A.REHIRE_DT THEN A.REHIRE_DT 
               ELSE A.HIRE_DT END MOST_REC_HIREDT 
    

    참고이 쿼리가 정말 엉망이라는 것을 알고 있습니다. 그래서 나는 도움을 요청합니다.

    SELECT DISTINCT 
    A.EMPLID 
    A.FIRST_NAME||' '||A.LAST_NAME WORKERNAME, 
    CASE 
        WHEN(Select Max(C1.EFFDT) FROM JOB C1 
         WHERE (C.EMPLID=C1.EMPLID 
         AND C1.ACTION=('TAF') 
         AND C1.PAYGROUP=A.PAYGROUP 
         AND C1.EFFDT>=(CASE WHEN A.HIRE_DT<A.REHIRE_DT THEN =A.REHIRE_DT 
         ELSE A.HIRE_DT END MR_HIRE_DT))) 
        WHEN A.EMPLID NOT IN JOB C1 
         THEN (CASE WHEN A.HIRE_DT<=A.REHIRE_DT 
         THEN A.REHIRE_DT 
         ELSE A.HIRE_DT END MR_HIRE_DT2) 
        ELSE 'Null' END EFFDT, 
    A.PAYGROUP 
    FROM EMPLOYEES A, PERSONAL_DATA B, JOB C 
    WHERE 
    A.EMPLID=B.EMPLID 
    AND 
    B.EMPLID=C.EMPLID 
    AND 
    A.PAYGROUP=C.PAYGROUP 
    AND 
    C.EMPL_STATUS in ('A','L','P','S') 
    
  • +1

    해결책은 다음과 같습니다. 각 테이블에서 "샘플 데이터"를 입력 한 다음 "expected result" –

    +0

    쿼리에서 테이블 B가 어디에 있습니까? 적절한 ANSI 조인을 사용할 수 있습니까? 더 나은 쿼리 작성에 도움이 될 것입니다 –

    +0

    각 테이블의 샘플 데이터와 결과로 얻으려는 결과를 포함하십시오. 또한'FROM' 절에 쉼표가 있으면 가장 잘못된 것이 있습니다. 적절한'JOIN'을 사용하십시오. –

    답변

    1

    표가 어떻게 관련되어 있는지 논리로 작업 할 때 ANSI 조인 구문을 사용하는 것이 중요합니다. 여기에는 2 개의 테이블 만 있지만 예제 쿼리에는 사용중인 4 개의 테이블 별칭 (A, B, C 및 C1)이 있습니다. 또한 E (Employee), J (Job) 등 테이블 이름과 관련된 테이블 별칭을 사용하는 것이 좋습니다.

    당신이 찾고있는 것은 JOB 테이블의 "최신"날짜이며 매우 유용한 기능 row_number()을 사용할 수 있습니다. partition by (그룹별로 약간 비슷 함)과 을 포함하는 over() 절과 함께 사용됩니다. 날짜가 내림차순으로 정렬되면 가장 최근 날짜 (사용 된 파티션으로 인해 직원 당)의 행 번호는 1입니다. 따라서 아래 서브 쿼리를 is_latest = 1으로 필터링하면 최신 유효 날짜가있는 직원 당 하나의 행이 생성됩니다. 또한이 옵션을 사용하면 select distinct을 사용할 필요가 없습니다.

    SELECT 
         E.EMPLID 
        , (E.FIRST_NAME || ' ' || E.LAST_NAME) WORKERNAME 
        , J.EFFDT PAYGROUP_EFFDT 
        , E.PAYGROUP 
    FROM EMPLOYEES E 
    INNER JOIN (
          SELECT 
            JOB.* 
           , ROW_NUMBER() OVER (PARTITION BY EMPLID 
                ORDER BY EFFDT DESC) AS is_latest 
          FROM JOB 
          WHERE EMPL_STATUS IN ('A','L','P','S') 
        ) J ON E.EMPLID=J.EMPLID AND J.is_latest = 1 
    
    +0

    우리는 peoplesoft를 모델로합니다. 그래서 우리는 행 번호, 유효 날짜 및 순서 만 가지고 있지 않습니다. 불행히도 Oracle SQL Developer 1.5.5를 사용하고 ANSI 조인을 수행하는 데 몇 가지 문제가있는 것으로 보입니다. 나는 테이블에 대해 잘 알고 있으며 이전 형식을 사용하여 누군가를 잃거나 복제 할 수도 있습니다. 최근에 대해서는 일반적으로 J.EFFDT = (SELECT MAX (J1.EFFDT) FROM PS_JOB @ EV5TEST2 J1 WHERE (JEMPLID = J1.EMPLID 및 J1.EFFDT <= SYSDATE))를 수행합니다. 이 시나리오에서는 최대 effdt + 시퀀스를 찾아야합니다 .JACTION = ('TAF')가 존재하지 않으면 가장 좋은 날짜를 부여합니다 (reire_dt를 rehire_dt와 비교) – MWils

    0

    내가 문제의 날짜를 어떻게 얻었는지 완전히 이해하지 못하기 때문에 여기에있는 작업이 지나치게 단순화 될 수 있습니다. 그러나 물론, 내가 무엇을하고 있는가하는 것입니다 :

    1. 는 직원이 중간 결과에서
    2. 의 작업 날짜가 첫 데이트 당을 얻을 수 직원 레코드에서 두 hire_dtrehire_dt의 이상을 얻을 직원

    쿼리 : 정말 제공하기 위해 도움이 될 무엇

    select emplid, max(dt) 
    from 
    (
        select emplid, greatest(nvl(hire_dt,rehire_dt),nvl(rehire_dt,hire_dt)) as dt from employees 
        union all 
        select emplid, effdt as dt from job where action = 'TAF' and empl_status in ('A','L','P','S') 
    ) 
    group by emplid 
    order by emplid;