2012-03-30 243 views
1

我正在想出一個統一的方式來計算單個表中兩列之間的百分比差異。 有時num1爲零,在這種情況下,計算的差值應爲100%。 有時num2爲零,在這種情況下,計算的差異應該是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語句如下所示。

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。 第五行是OK。 第六行從不顯示,因爲它會生成除零錯誤。

我希望我的結果集看起來像這樣:

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 2012-03-30 02:09:35

+0

每個插入旁邊的註釋顯示了每行的內容以及我希望顯示的內容。有更好的方式來表達嗎? – Snowy 2012-03-30 02:13:18

+0

您是否注意到您將'num2'聲明爲'int',然後嘗試插入'161.5'? – 2012-03-30 02:33:54

回答

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