2016-09-01 4 views
0

Um Division durch 0 zu vermeiden, verwende ich CAST AS FLOAT und NULLIF. Aber aus irgendeinem Grund gibt es mir Werte als 0. Alles, was ich tue, teilt Declined auf Submissions Was mache ich falsch?Division gibt Werte 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

Antwort

2

hier ein Weg ist, um es zu lösen, und die Abfrage zu erleichtern die fiese Vervielfältigung des Codes, berechnet zu lesen (entfernt Absagen und Eingaben).

Beispiel mit Dummy-internen Daten. Verschieben Sie die Verhältnisberechnung in eine äußere Abfrage.

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; 

Annahme, Rückgänge werden die Einreichungen niemals überschreiten.

Ich denke, es könnte besser sein, NULL im Fall "dividiere durch 0" statt 0 zurückzugeben, da 0 ein echtes Ergebnis ist.

+0

Danke. Großartige Idee – Oleg

0

vergessen YEAR zu sagen in

WHERE YEAR(EffectiveDate) =2016 
+0

Ich konnte sehen, wie das einen Fehler erzeugen würde, aber kein 'NULL'/0-Wert. –