как использовать NULLIF с агрегатной функцией

Я использую SQL Management Studio 2012. Я получаю сообщение об ошибке «Разделение на ноль». Я знаю, что для этого требуется использование NULLIF, но я не уверен, как использовать его в своем запросе.

это мой запрос

select 
    Ward,
    LocalAuthority,
    Fiscal,
    DR,

    cast(DR*100.0 /SUM(DR) OVER (
        partition by localauthority, fiscal
        order by fiscal asc) as Decimal (10,2)) as [DR%]
from (
    select  
        Fiscal,
        LocalAuthority,
        Ward,
        sum(case when code = 'DR' then 1 else 0 end) as DR
    from [dbo].[Table]
    where datetimeofcall >= '2014-04-01' 
    group by
        ward,
        localauthority,f
        fiscal
) as A

На самом деле я задавал этот вопрос, на который какой-то добрый человек ответил отлично, но это было без агрегатной функции OVER() и SUM, я путаюсь с синтаксисом. Я безуспешно пробовал различные коннотации ниже.

cast(DR*100.0 /NULLIF(SUM(DR,0),1) OVER(partition by localauthority,fiscal order by fiscal asc) as Decimal (10,2)) as [DR%]

person Clem_Fandango    schedule 04.11.2019    source источник


Ответы (1)


Используйте Case Expression для идентификации 0 в предыдущем

SELECT Ward, LocalAuthority, Fiscal, DR,
CASE WHEN SUM(DR) OVER(PARTITION BY localauthority, fiscal ORDER BY fiscal asc) = 0 THEN 0 ELSE CAST(DR*100.0 / SUM(DR) OVER(PARTITION BY  localauthority,fiscal ORDER BY fiscal) AS Decimal (10,2)) END AS [DR%]
FROM (
      SELECT Fiscal, LocalAuthority, Ward, SUM(CASE WHEN code = 'DR' THEN 1 ELSE 0 END) AS DR
      FROM [dbo].[Table]
      WHERE datetimeofcall >='2014-04-01' 
      GROUP BY ward, localauthority, fiscal
     ) AS A
person Vignesh Kumar A    schedule 04.11.2019