2014-05-22 3 views
0

Vous essayez d'écrire une instruction sql pour Peoplesoft.SQL Developer - Instruction CASE avec critères

Mon instruction actuelle "fonctionne" mais la sortie est incorrecte. Voici le sql:

SELECT 
A.EMPLID, 
A.DEPTID, 
A.LOCATION, 
A.PAYGROUP, 
A.STD_HOURS, 
A.ANNUAL_RT, 
A.COMPRATE, 
SUM(case b.comp_ratecd when 'NAANNL' then b.comprate else 0 end) AS NAANNL, 
sum(case b.comp_ratecd when 'NAHRLY' then b.comprate else 0 end) as NAHRLY, 
sum(case C.ERNCD when '007' then (C.HOURLY_RT + C.OTH_PAY) else 0 end) as BASEFTO, 
sum(case C.ERNCD when '013' then (C.HOURLY_RT + C.OTH_PAY) else 0 end) as DEFCOMP 
FROM PS_JOB A 
    ,PS_COMPENSATION B 
    ,ps_addl_pay_data C 
WHERE A.EFFDT = 
(SELECT MAX(A_ED.EFFDT) FROM PS_JOB A_ED 
WHERE A.EMPLID = A_ED.EMPLID 
AND A.EMPL_RCD = A_ED.EMPL_RCD 
AND A_ED.EFFDT <= SYSDATE) 
AND A.EFFSEQ = 
(SELECT MAX(A_ES.EFFSEQ) FROM PS_JOB A_ES 
WHERE A.EMPLID = A_ES.EMPLID 
AND A.EMPL_RCD = A_ES.EMPL_RCD 
AND A.EFFDT = A_ES.EFFDT) 
AND A.EMPL_STATUS = 'A' 
AND A.EMPLID = B.EMPLID 
AND A.EMPL_RCD = B.EMPL_RCD 
AND A.EFFSEQ = B.EFFSEQ 
AND B.EFFDT = A.EFFDT 
AND A.EMPLID = C.EMPLID (+) 
AND A.EMPL_RCD = C.EMPL_RCD (+) 
group by A.EMPLID , A.DEPTID, A.LOCATION, A.PAYGROUP, A.STD_HOURS, A.ANNUAL_RT, A.COMPRATE 
ORDER BY 1 ; 

Le problème est que quand il y a 2 ou plusieurs lignes c.addl_pay_data, le montant sous les colonnes NAANNL et NAHRLY est multiplié par le nombre de lignes dans addl_pay_data.

J'apprécierais toute aide qui me dirait comment écrire ceci de sorte que lorsque le compte de erncd de addl_pay_data est> 0, alors prenez le comprate de compensation et divisez par le compte erncd. Si le compte est = 0, il suffit de lister le comprate de la compensation.

Merci pour toute aide que vous pouvez fournir.

Répondre

0

Vous essayez d'additionner deux tables différentes sur une jointure. Au lieu de cela, vous devez faire l'agrégation pour chaque table enfant séparément dans un sous-requête, puis rejoindre sur le résultat:

SELECT 
    A.EMPLID, 
    A.DEPTID, 
    A.LOCATION, 
    A.PAYGROUP, 
    A.STD_HOURS, 
    A.ANNUAL_RT, 
    A.COMPRATE, 
    b.NAANNL, b.NAHRLY, c.BASEFTO, c.DEFCOMP 
FROM PS_JOB A 
LEFT OUTER JOIN (
    SELECT SUM(case b.comp_ratecd when 'NAANNL' then b.comprate else 0 end) AS NAANNL, 
     sum(case b.comp_ratecd when 'NAHRLY' then b.comprate else 0 end) as NAHRLY, 
     EFFDT, EMPL_RCD, EFFSEQ, EMPLID 
    FROM PS_COMPENSATION B 
    GROUP BY EFFDT, EMPL_RCD, EFFSEQ, EMPLID 
) AS B 
ON A.EMPLID = B.EMPLID 
AND A.EMPL_RCD = B.EMPL_RCD 
AND A.EFFSEQ = B.EFFSEQ 
AND B.EFFDT = A.EFFDT 
LEFT OUTER JOIN (
    SELECT sum(case C.ERNCD when '007' then (C.HOURLY_RT + C.OTH_PAY) else 0 end) as BASEFTO, 
     sum(case C.ERNCD when '013' then (C.HOURLY_RT + C.OTH_PAY) else 0 end) as DEFCOMP, 
     EMPLID, EMPL_RCD 
    FROM ps_addl_pay_data C 
    GROUP BY EMPLID, EMPL_RCD 
) AS C 
ON A.EMPLID = C.EMPLID (+) 
AND A.EMPL_RCD = C.EMPL_RCD (+) 
WHERE A.EFFDT = 
(SELECT MAX(A_ED.EFFDT) FROM PS_JOB A_ED 
WHERE A.EMPLID = A_ED.EMPLID 
AND A.EMPL_RCD = A_ED.EMPL_RCD 
AND A_ED.EFFDT <= SYSDATE) 
AND A.EFFSEQ = 
(SELECT MAX(A_ES.EFFSEQ) FROM PS_JOB A_ES 
WHERE A.EMPLID = A_ES.EMPLID 
AND A.EMPL_RCD = A_ES.EMPL_RCD 
AND A.EFFDT = A_ES.EFFDT) 
AND A.EMPL_STATUS = 'A' 
group by A.EMPLID , A.DEPTID, A.LOCATION, A.PAYGROUP, A.STD_HOURS, A.ANNUAL_RT, A.COMPRATE 
ORDER BY 1 ;