生效日期员工进入薪酬组

问题描述 投票:0回答:2

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

  • A是堆栈员工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')
sql oracle
2个回答
1
投票

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

您正在寻找的是来自表JOB的“最新”日期,并且可以使用非常有用的函数row_number()。它与over()子句一起使用,该子句包含partition by(有点类似于group by)和order by。按日期降序排序时,最近日期的行号为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
投票

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

  1. 从员工记录中获取两个hire_dtrehire_dt中的较大者
  2. 获得员工的工作日期
  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;
© www.soinside.com 2019 - 2024. All rights reserved.