A "Case" statement in SQL allows for an if/else condition.
SELECT EMPLID, SYSDATE, CASE
WHEN A.EFFDT = SYSDATE THEN (EFFSEQ + 1)
ELSE 0
END AS EFFSEQ, EMPL_RCD, 'DTA','CVG',COMPANY, POSITION_NBR, REPORTS_TO, SAL_ADMIN_PLAN,
CONCAT(RTRIM(PAYGROUP,'W'),'B') AS PAYGROUP
FROM PSOFT.PS_JOB a
WHERE a.paygroup LIKE '%W'
AND a.effdt = (SELECT MAX(b.effdt) FROM PSOFT.ps_job b
WHERE a.emplid = b.emplid
AND a.empl_rcd = b.empl_rcd )
AND a.effseq = (SELECT MAX(c.effseq) FROM PSOFT.ps_job c
WHERE a.emplid = c.emplid
AND a.empl_rcd = c.empl_rcd
AND a.effdt = c.effdt )
AND a.EMPL_STATUS IN ('A','L','P','S')
The bold portion of the SQL above allows me to increment the effseq by one where there is a record with an effective date equal to the sysdate. This is very helpful when trying to insert records into PS_JOB because two records inserted on the same date have to be sequenced to avoid unique constraint errors.
Monday, July 13. 2009
Joining a record to itself
This is a trick I learned to compare a row of data in the same record to the previous row and compare fields. In this case I wanted SQL to return rows where the worker's jobcode changed or the jobcode was the same but the department changed and a custom indicator was not set.
SELECT *
FROM psoft.ps_job a, psoft.ps_job b
WHERE a.emplid = '####'
AND a.emplid = b.emplid
AND a.effseq = b.effseq
AND b.effdt = (SELECT MAX(a2.effdt)
FROM psoft.ps_job a2
WHERE a2.emplid = a.emplid
AND a2.empl_rcd = a.empl_rcd
AND a2.effdt < a.effdt)
AND b.effdt <= SYSDATE
AND a.jobcode <> b.jobcode
OR a.emplid = '####'
AND a.emplid = b.emplid
AND a.effseq = b.effseq
AND b.effdt = (SELECT MAX(a3.effdt)
FROM psoft.ps_job a3
WHERE a3.emplid = a.emplid
AND a3.empl_rcd = a.empl_rcd
AND a3.effdt < a.effdt)
AND b.effdt <= SYSDATE
AND a.deptid <> b.deptid
AND a.jobcode = b.jobcode
AND a.QVC_JOBCD_CHG_IND <> 'Y'
OR a.emplid = '####'
AND a.emplid = b.emplid
AND a.effseq = b.effseq
AND a.effdt = (SELECT MAX(a3.effdt)
FROM psoft.ps_job a3
WHERE a3.emplid = a.emplid
AND a3.empl_rcd = a.empl_rcd
AND a3.effdt < b.effdt)
AND a.action = 'HIR'
The compare was accomplished by joining, in this case PS_JOB, to itself.
SELECT *
FROM psoft.ps_job a, psoft.ps_job b
WHERE a.emplid = '####'
AND a.emplid = b.emplid
AND a.effseq = b.effseq
AND b.effdt = (SELECT MAX(a2.effdt)
FROM psoft.ps_job a2
WHERE a2.emplid = a.emplid
AND a2.empl_rcd = a.empl_rcd
AND a2.effdt < a.effdt)
AND b.effdt <= SYSDATE
AND a.jobcode <> b.jobcode
OR a.emplid = '####'
AND a.emplid = b.emplid
AND a.effseq = b.effseq
AND b.effdt = (SELECT MAX(a3.effdt)
FROM psoft.ps_job a3
WHERE a3.emplid = a.emplid
AND a3.empl_rcd = a.empl_rcd
AND a3.effdt < a.effdt)
AND b.effdt <= SYSDATE
AND a.deptid <> b.deptid
AND a.jobcode = b.jobcode
AND a.QVC_JOBCD_CHG_IND <> 'Y'
OR a.emplid = '####'
AND a.emplid = b.emplid
AND a.effseq = b.effseq
AND a.effdt = (SELECT MAX(a3.effdt)
FROM psoft.ps_job a3
WHERE a3.emplid = a.emplid
AND a3.empl_rcd = a.empl_rcd
AND a3.effdt < b.effdt)
AND a.action = 'HIR'
The compare was accomplished by joining, in this case PS_JOB, to itself.
(Page 1 of 1, totaling 2 entries)


