2017-12-18 1 views
0

従業員が給与グループに入ったときにeffective dateを見つける必要があります。これは、雇用日、再就職日、または譲渡日のいずれか遅い日に発生したかのいずれかです。私がしたいと思うのは、最も最近の有効日の一時テーブルを作成することですwhere C1.ACTION=('XFR') AND C1.PAYGROUP=A.PAYGROUP、そのテーブルにnotのアソシエイトがある場合は、私にmost recent hire dateを与えてください。有効日従業員が入力した給与グループ

  • がスタック従業員DTAのトップである
  • Bがスタック個人データのトップである
  • C全体の従業員レコード

最近入社日があるさ

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

FYI私はこのクエリが本当に台無しであることを知っているので、私は助けを求めています。

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

解決策は次のとおりです。各テーブルの "サンプルデータ"、次に "期待結果" –

+0

そのクエリのテーブルBはどこですか?適切なANSI結合を使用できますか?より良いクエリを作成するのに役立ちます –

+0

各テーブルのサンプルデータと、結果として得たい出力を含めてください。また、 'FROM'節にカンマがある場合は、何か間違っている可能性が最も高いです。適切な 'JOIN'を使用してください。 –

答えて

1

本当にテーブルがどのように関連するかのロジックを通して取り組んで、それは(多くの)助剤として結合構文をANSIを使用することが重要です。ここでは2つのテーブルしか持っていませんが、サンプルクエリでは4つのテーブルエイリアスが使用されています(A、B、C、C1)。さらに、EEmployee)、JJob)などのテーブルの名前に関連するテーブルエイリアスを使用すると便利です。

あなたが探しているのは、テーブルJOBの「最新の」日付であり、これには非常に便利な機能row_number()を使用できます。これは、partition by(これはグループに少し似ています)とを含むover()節と組み合わせて使用​​されます。日付の降順で並べ替えると、最も最近の日付(使用されているパーティションのために従業員1人あたり)の行番号は1になります。したがって、サブクエリをis_latest = 1でフィルタリングすると、従業員1人につき最新の有効日を持つ行が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 AND J1.EFFDT <= SYSDATE))を行います。このシナリオでは、最大effdt +シーケンスを見つける必要があります.JACTION =( 'TAF')が存在しない場合は、最大の日付を与えます(hire_dtとrehire_dtを比較) – MWils

0

問題の日付をどのように取得するのか完全に理解できていないため、ここではタスクを単純化することがあります。しかしまあ、私がやっていることは次のとおりです。

  1. 従業員レコード
  2. から2 hire_dtrehire_dtの大きなは、これらの中間結果から従業員
  3. のジョブ日付があたり最初の日付を取得ゲット従業員

クエリ:本当にの提供しするのに役立つだろう何

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; 
関連する問題