是否可以在一份报告中获得当前和以前的薪水?
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)
)
我是 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)
)