2012-03-30 4 views
1

단일 테이블의 두 열 사이의 백분율 차이를 계산하는 일관된 방법을 고안하려고합니다. 가끔 num1이 0 인 경우 계산 된 차이는 100 %이어야합니다. 가끔 num2가 0 인 경우 계산 된 차이가 100 %이어야합니다. 때때로 num1과 num2의 차이가 매우 커서 계산 된 차이는 100 %가됩니다. 여기 SQL Server 백분율 계산

테이블에서 샘플 추출물 :
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 행은 OK입니다. 다섯 번째 행의 행이 정상입니다. 여섯 번째 행은 0으로 나누기 오류를 생성하므로 절대 표시되지 않습니다.

나는 같이하는 세트 내 결과를 원하는 :

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 

어떻게 내가 그것을 필요로하는 방법을 반환 무언가로 내 변경을 선택해야합니까?

감사합니다.

+0

... 후 일부 샘플 데이터를 원하는 :

당신은 제로 경우로 분할에 여분의 비트를 할 필요가 출력 ... – Teja

+0

각 삽입 옆에있는 주석은 각 행에 대해 발생하는 상황과 표시하려는 내용을 보여줍니다. 거기에 더 좋은 방법이 있습니까? – Snowy

+0

'num2'를'int'로 선언 한 다음'161.5'를 삽입하려고 시도 했습니까? –

답변

3

선택 목록의 세 번째 항목에서 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

here을 참조하십시오.

당신이 질문을하려고 무엇 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