SQL Server Процентное вычисление - PullRequest
1 голос
/ 30 марта 2012

Я пытаюсь придумать единый способ вычисления процентных разниц между двумя столбцами в одной таблице.Иногда num1 равен нулю, и в этом случае рассчитанная разница должна составлять 100%.Иногда num2 равен нулю, и в этом случае рассчитанная разница должна составлять 100%.Иногда различия между num1 и num2 очень велики, и в этом случае расчетная разница будет 100%.

Вот пример выдержки из таблицы:

declare @numtable table ( num1 decimal(10,3) , num2 decimal(10,3) )
insert into @numtable values ( 160 , 161.5 )
insert into @numtable values ( 439 , 377 )
insert into @numtable values ( 100 , 1 )
insert into @numtable values ( 1 , 100 )
insert into @numtable values ( 0 , 20 ) 
insert into @numtable values ( 20 , 0 ) 

Я сделал неработающийВыберите оператор, который выглядит следующим образом.

select num1 , num2 , Abs(100- ( 100 * cast( cast(num1 as decimal(6,3)) / cast(num2 as decimal(10,3) ) as decimal(6,3) ) ) ) as percentdiff
from @numtable

Что делает это:

num1         num2         percentdiff
------------ ------------ -------------
160.000      161.500      0.900
439.000      377.000      16.400
100.000      1.000        9900.000
1.000        100.000      99.000
0.000        20.000       100.000

Первые 3 строки в порядке.Пятый ряд строки в порядке.Шестая строка никогда не показывается, потому что она генерирует ошибку деления на ноль.

Я хочу, чтобы мой набор результатов выглядел следующим образом:

num1         num2         percentdiff
------------ ------------ -------------
160.000      161.500      0.900
439.000      377.000      16.400
100.000      1.000        9900.000
1.000        100.000      9900.000
0.000        20.000       100.000
20.000       20.000       100.000

Как мне изменить мой выбор на что-то, что возвращаеткак мне это нужно?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 30 марта 2012

Я бы использовал оператор case в третьем элементе списка выбора, чтобы проверить ошибку деления на 0.В остальном делай математику.Это так просто.

Select num1, num2,
 Case num2
 WHEN 0 Then 100
 Else Abs(100- ( 100 * cast( cast(num1 as decimal(6,3)) / cast(num2 as decimal(10,3) ) as decimal(6,3) ) ) ) 
 END as percentdiff

From @numtable
1 голос
/ 30 марта 2012

См. здесь .

Вам просто нужно сделать немного больше при делении на ноль case:

case when num1 <= 0 or num2 <= 0 or num1 = num2 then 100

select num1,num2,
case when num1 <= 0 or num2 <= 0 or num1 = num2 then 100
  else
   case when 
   cast(
     cast(abs(num1-num2) as decimal(8,5))
     /
     cast(case when num1>num2 then num2 else num1 end as decimal(8,5))
     * 100
   as decimal(8,2))
   > 100 then
     9900 
   else
    cast(
     cast(abs(num1-num2) as decimal(8,5))
     /
     cast(case when num1>num2 then num2 else num1 end as decimal(8,5))
     * 100
   as decimal(8,2))
   end
  end as percentage
from t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...