2017-02-21 59 views
-1
SELECT pstartdate, 
     opbal, 
     joined, 
     resign, 
     (opbal + joined - resign) clbal 
     , 
     (Round(((resign * 100)/(opbal + joined))/100, 2) * 100 
     ) attriation 
FROM (SELECT pstartdate, 
       penddate, 
       Getopempbal(pstartdate)   OpBal, 
       Getempjn(pstartdate, penddate) Joined, 
       Getempres(pstartdate, penddate) Resign 
     FROM (SELECT Add_months(:startdate, LEVEL - 1) pstartdate, 
         Add_months(:startdate, LEVEL) - 1 penddate 
       FROM dual 
       CONNECT BY LEVEL <= Months_between(:enddate, :startdate) + 1)) 
ORDER BY To_number(1) 

當我執行此查詢錯誤來plsql中除數是否等於零?

除數爲零。

我認爲錯誤這個地方

(round(((resign*100)/(opbal+joined))/100,2)*100) attriation

+0

錯誤是說你不能被0分割。那意味着opbal + joined = 0 – SaggingRufus

+0

你使用的是MySQL,MS SQL Server還是Oracle?不要標記不涉及的產品。 – jarlh

+0

格式正確。編輯時,標記代碼並點擊'{}'。 – jarlh

回答

-2
SELECT pstartdate, 
     opbal, 
     joined, 
     resign, 
     (opbal+joined-resign) clbal, 
     round((**NULLIF**(resign,0) *100)/(opbal + joined)) ab 
FROM 
    (SELECT pstartdate, 
      penddate, 
      getopempbal(pstartdate) opbal, 
      getempjn(pstartdate,penddate) joined, 
      getempres(pstartdate,penddate) resign 
    FROM 
    (SELECT add_months(:startdate, LEVEL-1) pstartdate, 
      add_months(:startdate, LEVEL)-1 penddate 
     FROM dual CONNECT BY LEVEL <= months_between(:enddate, :startdate) + 1)) 
ORDER BY to_number(1) 
+0

使用nullif獲取答案 –

+0

問題 - 如錯誤所述 - 與除數一起使用,而不是divdend。你有錯誤的表達你的nullif。 –

3

我建議你在做除法時使用nullif()功能:

select . . . 
     (Round(((resign * 100)/nullif(opbal + joined, 0))/100, 2) * 100 
     ) attriation 

這將返回NULL如果分母爲零。