是否可以在一份报告中获得当前和以前的薪水?

Is it possible to get current and previous salaries on one report?

我是 peoplesoft 的新手,我目前正在构建一个报告,我希望在该报告中获得某个员工在一段时间内的当前和之前的薪水。例如,如果员工 A 在 2017 年获得加薪,那么我希望在两个不同的列中看到之前和当前的薪水。我要修改的报告是所有当前信息。我添加了包含工资数据的 EE Job 记录。报告已经有了这个记录,所以现在有两个; A和C我想用C作为回头查看之前的工资

我想我可以通过修改条件、条件类型 (eff date <) 然后将表达式二作为一个字段 (A.EFFDT) 来做到这一点。但这没有用。

我是不是完全错了(peoplesoft 可以做到这一点吗?)

我认为在 PeopleSoft Query 中解决所有 EFFDT 和 EFFSEQ 的完整解决方案会很困难,但您的想法可以通过几个假设来接近。

  • 一个是要获得 "old salary" 我们总是至少在 "current" JOB 行前一天查看 JOB 行。这意味着我看不到多个 EFFSEQ 在同一天发生的工资变化。
  • 第二个假设是不处理多个作业,所以相同 EMPL_RCD。

您将有一个如您所描述的查询,作业 table 添加了两次,因此作业 A 和作业 C。在条件中,您将具有以下内容:

  • A.EFFDT Eff Date <= Current Date (EffSeq = Last) -- 如果您只想要当前行
  • AND A.EMPLID 等于 B.EMPLID
  • AND A.EMPL_RCD 等于 B.EMPL_RCD
  • AND Field B.EFFDT Eff Date < Field A.EFFDT EffSeq = Last

您还可以只添加在职员工,或根据需要添加特定的 EMPLID,但不希望 JOB tables 之间有任何其他联接。

SQL 看起来像这样...

select a.emplid, a.empl_rcd, a.effdt, a.effseq
     , a.annual_rt as new_salary, c.effdt, c.effseq, c.annual_rt as old_salary
from ps_job a, ps_job c
where a.emplid = c.emplid
and a.empl_rcd = c.empl_rcd
and a.effdt = (select max(a1.effdt) from ps_job a1
               where a1.emplid = a.emplid
               and a1.empl_rcd = a.empl_rcd
               and a1.effdt <= sysdate)
and a.effseq = (select max(a2.effseq) from ps_job a2
                where a2.emplid = a.emplid
                and a2.empl_rcd = a.empl_rcd
                and a2.effdt = a.effdt)    
and c.effdt = (select max(c1.effdt) from ps_job c1
               where c1.emplid = c.emplid
               and c1.empl_rcd = c.empl_rcd
               and c1.effdt < a.effdt)
and c.effseq = (select max(c2.effseq) from ps_job c2
                where c2.emplid = c.emplid
                and c2.empl_rcd = c.empl_rcd
                and c2.effdt = c.effdt)
order by a.emplid, a.empl_rcd, a.effdt desc, c.effdt desc

这将给出每个 EE 的当前行和至少前一天的最大作业行的费率。如果需要所有行,请删除当前行逻辑。

SQL 仅部分正确。您可以在同一天进行多项操作。您有 c.effdt 作为 < a.effdt。不知道是不是每次都是这样。

从 SQL 的角度来看,您需要一个 OR 语句。

( a.effseq = 0
and  c.effdt = (select max(c1.effdt) from ps_job c1
               where c1.emplid = c.emplid
               and c1.empl_rcd = c.empl_rcd
               and c1.effdt < a.effdt)
and c.effseq = (select max(c2.effseq) from ps_job c2
                where c2.emplid = c.emplid
                and c2.empl_rcd = c.empl_rcd
                and c2.effdt = c.effdt)
)
or
(a.effseq > 0 
and a.effdt = c.effdt 
and c.effseq = (a.effseq -1)
)