2014-05-22 86 views
0

試圖爲Peoplesoft寫一條sql語句。SQL Developer - 帶條件的CASE語句

我當前的陳述「有效」,但輸出不正確。這裏是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 ; 

的問題是,當有c.addl_pay_data 2個或更多行時,NAANNL和NAHRLY列下的金額乘以在addl_pay_data的行數。

我會很感激任何幫助,會告訴我如何編寫這個,以便當從addl_pay_data的erncd的計數大於0時,然後採取補償comprate併除以計數erncd。如果計數= 0,那麼只需從補償中列出合計。

感謝您提供的任何幫助。

回答

0

您試圖通過連接對兩個不同的表進行求和。相反,您應該爲子查詢中的每個子表單獨進行的聚合,然後加入結果:

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 ;