我们有两张表格,里面有关于病假和休假应计的信息。一个是总体工资表,另一个是一个临时表,主管用来验证员工是否已进入每个月的病假/休假时间,或确认他们正在那个月0
小时。
薪资表为PS_LEAVE_ACCRUAL
,并且具有此结构(以及其他不相关的列):
EMPLID | EMPL_RCD | COMPANY | PLAN_TYPE | ACCRUAL_PROC_DT | HRS_TAKEN_UNPROC
------ | -------- | ------- | --------- | --------------- | ----------------
123456 | 0 | ABC | 50 | 28-FEB-17 | 3
123456 | 0 | ABC | 51 | 28-FEB-17 | 0
987654 | 0 | ABC | 50 | 28-FEB-17 | 0
987654 | 0 | ABC | 51 | 28-FEB-17 | 3
临时表为Y_SIC_VAC_HRS
,它具有上述结构,但有一个额外的列Y_NO_HRS_TAKEN
,其中包含Y
/ N
值。这用于验证如果员工在某个月内花了0
小时,他们已经确认了,而不是仅仅将其保留为0
。
我们需要构建一个SQL语句来抓取PS_LEAVE_ACCRUAL
表中0
HRS_TAKEN_UNPROC
的所有值,并将其与Y_SIC_VAC_HRS
表连接到删除HRS_TAKEN_UNPROC
不是0
的所有已加入行,或者 0
时,Y_NO_HRS_TAKEN
标记设置为Y
这意味着员工已经确认他们正在那个月0
小时。
基本上,我们只关心员工不为病假/休假时间输入余额的月份(如果Y_NO_HRS_TAKEN
标志为Y
,那就是相当于他们进入平衡)。我们也只关心在作为绑定:1
传递的任意日期之后的行。
以下是我们尝试过的SQL:
SELECT la.EMPLID
, la.EMPL_RCD
, la.COMPANY
, la.PLAN_TYPE
, la.ACCRUAL_PROC_DT
, la.HRS_TAKEN_UNPROC
, 'N'
FROM PS_LEAVE_ACCRUAL la LEFT OUTER JOIN PS_Y_SIC_VAC_HRS sv ON la.EMPLID = sv.EMPLID
AND la.EMPL_RCD = sv.EMPL_RCD
AND la.COMPANY = sv.COMPANY
AND la.PLAN_TYPE = sv.PLAN_TYPE
AND la.ACCRUAL_PROC_DT = sv.ACCRUAL_PROC_DT
WHERE (la.HRS_TAKEN_UNPROC = 0
AND la.PLAN_TYPE IN ('50', '51')
AND la.ACCRUAL_PROC_DT > :1)
OR ( sv.HRS_TAKEN_UNPROC = 0
AND sv.Y_NO_HRS_TAKEN = 'N')
请注意,计划类型50
指的是病假时间,51
指的是假期时间。
PS_LEAVE_ACCRUAL
中每个月有一个条目,但Y_SIC_VAC_HRS
每个月可能没有条目。
答案 0 :(得分:1)
这样的东西?
let target = 3.9;
sortedArray.sort((a, b) => Math.abs(a.b - target) > Math.abs(b.b - target))[0]
答案 1 :(得分:0)
@ mathguy的回答几乎对我有用,但我真正需要的是:
select emplid, empl_rcd, company, plan_type, accrual_proc_dt, hrs_taken_unproc
from ps_leave_accrual
where accrual_proc_dt > :1
and plan_type in ('50', '51')
and hrs_taken_unproc = 0
and (emplid, plan_type, accrual_proc_dt)
not in (
select emplid, plan_type, accrual_proc_dt
from ps_y_sic_vac_hrs
where accrual_proc_dt > :1
and plan_type in ('50', '51')
and (y_no_hrs_taken = 'Y'
or hrs_taken_unproc <> 0
)
)
;
我需要从登台表中过滤掉两种类型的行:
hrs_taken_unproc
位于0
和的位置标记了表示已审核过的国旗。0
在原始工资表中的小时数,但在临时表中为<> 0
。