Процент двух значений, возвращающих NULL - PullRequest
0 голосов
/ 29 августа 2018

То же, что и вчерашний вопрос, на который был успешно получен ответ, но другая проблема. У меня есть два значения, 1 и 0, для которых мне нужно рассчитать процентное изменение. Исходя из этого сайта http://www.percent -change.com / index.php? Y1 = 1 & y2 = 0 процентное изменение между 1 и 0 составляет -100%. Исходя из предложенной формулы (((y2-y1)) / y1) мой код выглядит следующим образом.

DefinedYearVSPriorYearIndividual = ((( CTEDefinedYear.IndividualCases - CTEPreviousYear.IndividualCasesLastYear ))
                                              / ( CTEPreviousYear.IndividualCasesLastYear ) ) * 100

, который возвращает NULL.

Два числа

CTEDefinedYear.IndividualCases = 1
CTEPreviousYear.IndividualCasesLastYear = 0

Желаемый результат должен быть -100%.

Кто-нибудь может увидеть, что я делаю не так?

Ответы [ 4 ]

0 голосов
/ 29 августа 2018

Получил работу с этим кодом.

DefinedYearVSPriorYearIndividual =  ISNULL(100.0 * 
                                        (ISNULL(CTEDefinedYear.IndividualCases,0) 
                                        - ISNULL(CTEPreviousYear.IndividualCasesLastYear,0)) 
                                        / NULLIF(CTEPreviousYear.IndividualCasesLastYear,0),0)
0 голосов
/ 29 августа 2018

В вашем случае, вы переключили переменные. прилагаемая формула верна.

select ((0 - 1) / 1)*100;

Но вы использовали select ((1 - 0) / 0)*100;

Итак, вы получите ошибку:

Msg 8134, Level 16, State 1, Line 1
Divide by zero error encountered.
0 голосов
/ 29 августа 2018

Вы должны обрабатывать 0 на стороне деления с помощью логики CASE, чтобы избежать ошибки деления на ноль.

DECLARE @CTEDefinedYear_IndividualCases INT = 1
DECLARE @CTEPreviousYear_IndividualCasesLastYear INT = 0

SELECT ((@CTEDefinedYear_IndividualCases - @CTEPreviousYear_IndividualCasesLastYear) / (CASE WHEN @CTEPreviousYear_IndividualCasesLastYear = 0 THEN 1 ELSE @CTEPreviousYear_IndividualCasesLastYear END)) * 100
0 голосов
/ 29 августа 2018

Вот ответ.

Declare @y1 as int =1; 
Declare @y2 as int =0;
 select (((@y2- @y1))/ @y1)*100

Выход -100. Вы пропустили * 100 часть.

...