Деление дает значения 0

Чтобы избежать деления на 0, я использую CAST AS FLOAT и NULLIF. Но по какой-то причине он дает мне значения как 0. Все, что я делаю, это деление Declined на SubmissionsЧто я делаю неправильно?

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

введите описание изображения здесь

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;

Предположение, отклонения никогда не будут превышать представления.

Я думаю, что может быть лучше возвращать NULL в случае "деления на 0", а не 0, так как 0 является подлинным результатом.

Забыл сказать YEAR в

WHERE YEAR(EffectiveDate) =2016 
Другие вопросы по тегам