2010-08-18 49 views
1

我試圖編寫一個查詢,通過將我通過SUM選擇的2個總數除以給出一個百分比(例如.885之類的東西)。但是我的結果是0.0而不是正確的數字。所以僅供參考,從2個查詢,我有:SQL Server:在轉換後得到正確的十進制值時遇到問題

SELECT SUM(CASE WHEN Status_ID = 1 AND State_ID = 14 THEN 1 ELSE 0 END) 
FROM SomeTable 

其中產量158和:

SELECT SUM(CASE WHEN State_ID = 14 THEN 1 ELSE 0 END) 
FROM SomeTable 

產量現在203

,如果我只是做這:

SELECT SUM(CASE WHEN Status_ID = 1 AND State_ID = 14 THEN 1 ELSE 0 END)/SUM(CASE WHEN State_ID = 14 THEN 1 ELSE 0 END) 
FROM SomeTable 

我會得到0,因爲一切都被用作整數。所以我試過這個:

SELECT CAST(SUM(CASE WHEN Status_ID = 1 AND State_ID = 14 THEN 1 ELSE 0 END)/SUM(CASE WHEN State_ID = 14 THEN 1 ELSE 0 END) AS DECIMAL(3,1)) 
FROM SomeTable 

但是我的結果是0.0。這顯然不是我想要的。我想越來越.778

我在想,我需要單獨鑄造數字,但我試過,得到了算術溢出異常。有沒有人看到我可以做什麼不同?

我正在使用SQL Server 2005.非常感謝。

回答

3

當你這樣做會發生什麼

THEN 1.0 ELSE 0.0 

你也可以施放每一個你分度號,沒有一點鑄造總和

也看到

select 3/2 --1 
select 3/2.0 --1.500000 
select 3/convert(decimal(3,2),2) --1.500000 

所以這是單程

SELECT SUM(convert(decimal(3,2), 
CASE WHEN Status_ID = 1 AND State_ID = 14 THEN 1 ELSE 0 END))/ 
SUM(convert(decimal(3,2),CASE WHEN State_ID = 14 THEN 1 ELSE 0 END)) 

要處理除以0做到這一點

SELECT CASE SUM(convert(decimal(3,2),CASE WHEN State_ID = 14 THEN 1 ELSE 0 END)) 
when 0 then 0 else SUM(convert(decimal(3,2), 
CASE WHEN Status_ID = 1 AND State_ID = 14 THEN 1 ELSE 0 END))/ 
SUM(convert(decimal(3,2),CASE WHEN State_ID = 14 THEN 1 ELSE 0 END)) END 

參見這裏:SQL Server efficient handling of divide by zero

+0

感謝您的回覆。我最終使用了你在最後給出的例子,它工作得很好。但看起來好像第二個SUM(分母)可能爲0的情況。當發生這種情況時,我得到了一個異常,並且我不知道如何處理它。你有什麼想法? – 2010-08-18 19:49:05

+0

更新了我的回覆 – SQLMenace 2010-08-18 20:10:29

0

你有正確的想法,你只是沒有用它遠遠不夠。

SELECT CAST(SUM(CASE WHEN Status_ID = 1 AND State_ID = 14 THEN 1 ELSE 0 END) AS DECIMAL(3,1))/CAST(SUM(CASE WHEN State_ID = 14 THEN 1 ELSE 0 END) AS DECIMAL(3,1)) 
FROM SomeTable 
0

您的表達式正在進行整數除法,然後轉換爲十進制。您必須更改表達式,以便它將小數點作爲分隔符。將常量設置爲小數(1.0,0.0)或鑄造至少一個整數作爲小數應該可以避免這個問題。