【问题标题】:Effective Date Employee Entered Pay Group生效日期员工进入薪酬组
【发布时间】:2017-12-19 22:45:55
【问题描述】:

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

  • A 是栈顶员工数据
  • 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')

【问题讨论】:

  • 真正有助于提供解决方案的是:每个表中的“样本数据”,然后是“预期结果”
  • 该查询中的表B 在哪里?您可以使用正确的 ANSI 连接吗?这将帮助您构建更好的查询
  • 请包括来自每个表的样本数据,以及您希望得到的输出结果。此外,如果您的 FROM 子句中有逗号,那么您很可能做错了什么。使用正确的JOIN

标签: sql oracle


【解决方案1】:

使用 ANSI 连接语法确实很重要,因为它有助于(很多)处理表之间的关联逻辑。这里我们只有 2 个表,但在示例查询中使用了 4 个表别名(A、B、C 和 C1)。此外,它有助于使用与表名称相关的表别名,例如 E 代表 EmployeeJ 代表 Job

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

【讨论】:

  • 我们仿照peoplesoft,所以我们没有行号,只有生效日期和序列。不幸的是,我使用的是 Oracle SQL Developer 1.5.5,并且在执行 ANSI 连接时似乎遇到了一些问题。我非常熟悉这些表格以及使用旧格式可能会丢失或重复某人的地方。至于最新的,我通常会做 J.EFFDT= (SELECT MAX(J1.EFFDT) FROM PS_JOB@EV5TEST2 J1 WHERE (J.EMPLID=J1.EMPLID AND J1.EFFDT
【解决方案2】:

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

  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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多