2016-09-01 23 views
0

爲了避免被0除,我使用CAST AS FLOAT和NULLIF。 但由於某種原因,它給了我值0 所有我做的是將在Submissions Declined我在做什麼錯?分部給出的值0

SELECT   [Status Reason], 
       b.MonthNum, 
       b.YearNum, 
       ISNULL(SUM(CASE WHEN Status = 'Declined' THEN 1 ELSE 0 END),0) as Declined, 
       (
        SELECT COUNT(ControlNo) 
        FROM ClearanceReportMetrics 
        WHERE YEAR(EffectiveDate) =YEAR(GETDATE()) AND CompanyLine = 'Ironshore Insurance Company' 
        AND LineOfBusiness NOT IN ('SSP Commercial General Liability','SSP Property') AND Underwriter <> 'Batcheller, Jerry' 
       ) AS Submissions, 

     /*And this is what gives 0's */ 

       COALESCE(CAST(SUM(CASE WHEN Status = 'Declined' THEN 1 ELSE 0 END) AS FLOAT)/
       (   /* Here I am using NULLIF to avoid division by 0 */ 
        SELECT NULLIF(COUNT(ControlNo),0) 
        FROM ClearanceReportMetrics 
        WHERE EffectiveDate =YEAR(GETDATE()) AND CompanyLine = 'Ironshore Insurance Company' 
          AND LineOfBusiness NOT IN ('SSP Commercial General Liability','SSP Property') AND Underwriter <> 'Batcheller, Jerry' 
       ),0) AS DeclinedRatio 

FROM  tblCalendar b 
LEFT JOIN ClearanceReportMetrics a ON b.MonthNum = MONTH(a.EffectiveDate) and b.YearNum = YEAR(a.EffectiveDate) 
       --AND EffectiveDate >=DateAdd(yy, -1, DATEADD(d, 1, EOMONTH(GETDATE()))) AND EffectiveDate <= EOMONTH(GETDATE()) AND CompanyLine = 'Ironshore Insurance Company' AND Status = 'Declined' 
       --AND LineOfBusiness NOT IN ('SSP Commercial General Liability','SSP Property') 
WHERE  b.YearNum = YEAR(GETDATE()) 
GROUP BY b.YearNum,b.MonthNum,[Status Reason] 
ORDER BY b.YearNum, b.MonthNum ,Declined DESC 

enter image description here

回答

2

這裏是一個辦法來解決它,使查詢更容易閱讀(移除代碼計算的討厭的重複拒絕和提交)。

實施例使用虛設內部數據。將比率計算移至外部查詢。

SELECT 
    x.* 
    ,CASE 
     WHEN Submissions > 0 
     THEN CAST(Declined AS FLOAT)/Submissions 
     ELSE NULL 
    END DeclinedRatio 
FROM 
(
    -- Dummy data, replace with existing query (except ratio calculation). 
    SELECT 
      'Does Not Meet Underwriting Guidelines' [Status Reason] 
      ,1 MonthNum 
      ,2016 YearNum 
      ,5 Declined 
      ,10 Submissions 
) x; 

假設,下降將永遠不會超過提交。

我認爲它可能是更好的「0分」情況下,在返回NULL,而不是0,因爲0是一個真正的結果。

+0

謝謝。好想法 – Oleg

0

忘了說YEAR

WHERE YEAR(EffectiveDate) =2016 
+0

我可以看到這將如何產生一個錯誤,但不是'NULL'/0值。 –