生效日期员工进入薪酬组

时间:2017-12-18 22:49:56

标签: sql oracle

当员工进入薪资组时,我需要找到effective date。它发生在租用日期,重新生成日期或转移日期,以最新者为准。我想我想要做的是创建一个最近有效日期where C1.ACTION=('XFR') AND C1.PAYGROUP=A.PAYGROUP的临时表,当该表中的员工为not时,给我most recent hire date

  • A 是Stack Employee Dta的顶部
  • B 是堆叠个人数据之首
  • C 是整个员工记录

最近的雇用日期

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')

2 个答案:

答案 0 :(得分:1)

使用ANSI连接语法非常重要,因为它有助于(很多)完成表格关联的逻辑。这里我们只有2个表,但在示例查询中有4个表别名正在使用(A,B,C和C1)。此外,它有助于使用与表格名称相关的表别名,例如E的{​​{1}},Employee的{​​{1}}。

您所寻求的是&#34;最新的&#34;表J中的日期,可以使用非常有用的函数Job。它与JOB子句一起使用,该子句包含row_number()(与group by有点相似)和over()。按日期降序排序时,最近日期的行号为1(由于使用了分区,每位员工)。因此,如果我们按partition by过滤下面的子查询,我们会为每位员工提供一行最新生效日期。请注意,这也消除了现在使用order by的需要。

is_latest = 1

答案 1 :(得分:0)

我可能在这里过度简化任务,因为我不完全理解我们如何到达相关日期。但是,我正在做的是:

  1. 从员工记录中获取两个hire_dtrehire_dt中的较大者
  2. 获取员工的工作日期
  3. 从这些中间结果获得每位员工的第一个日期
  4. 查询:

    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;