Как найти процентную разницу при использовании полного внешнего соединения в записи?
Я хотел бы найти итеративный способ получения процентной разницы от данных, возвращаемых при полном внешнем объединении, который допускает, чтобы как текущие, так и предыдущие значения были нулевыми, поскольку они могли выпасть из любого набора результатов.
С учетом предыдущего значения это нормально при обычном расчете, который будет....
round(abs(100.0*(isnull(am.[Current Value],0) - isnull(pm.[Previous Value],0)) / isnull(pm.[Previous Value],0)), 2) <> 0
Однако это не позволит текущему значению быть равным нулю, и вы получите ошибку деления на ноль. Единственный относительно безопасный обходной путь, о котором я до сих пор думал, - это установить значение isnull в 1, а затем проверить, соответствует ли значение текущему, и установить в 100, но я не думаю, что могу рассчитывать на это в долгосрочной перспективе, у кого-нибудь есть лучшее предложение?
case when round(abs(100.0*(isnull(am.[Current Value],0) - isnull(pm.[Previous Value],0)) / isnull(pm.[Previous Value],1)), 2) = (isnull(am.[Current Value],0)*100) then 100
else round(abs(100.0*(isnull(am.[Current Value],0) - isnull(pm.[Previous Value],0)) / isnull(pm.[Previous Value],1)), 2)
end '%Diff'
1 ответ
Извините, здесь рано, простое решение
case when isnull([Current Total Value],0) = 0 and isnull([Previous Total Value],0) <> 0 then 100
when isnull([Previous Total Value],0) = 0 and isnull([Current Total Value],0) <> 0 then 100
when isnull([Previous Total Value],0) = 0 and isnull([Current Total Value],0) = 0 then 0
else round(abs(100.0*(isnull(am.[Current Total Value],0) - isnull(pm.[Previous Total Value],0)) / isnull(pm.[Previous Total Value],0)), 2)
end