2012-02-28 90 views
2
CASE 
WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))> 0 AND (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))<=0.25 THEN (0.25+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar))) 

WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))> 0.25 AND (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))<=0.50 THEN (0.50+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar))) 

WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))> 0.50 AND (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))<=0.75 THEN (0.75+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar))) 

WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))> 0.75 AND (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))<1 THEN (1+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar))) 


WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))= 0 THEN (0+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar))) 

END 

AS Estimated_Effort_Days, 

上述代碼正在將名爲totaleffort的字段四捨五入爲最接近的25,例如,如果我的值爲78.19,它將舍入爲78.25。將數據類型varchar轉換爲浮點時出錯

我有一個零值的新要求,當值= 0,那麼我需要顯示文本「未知數」我試圖添加一個額外的case語句,但查詢無法運行的錯誤:

Error converting data type varchar to float.

有誰有reccomendation我

回答

1

首先,你現在的代碼返回一個的數字。並且您正嘗試添加一個條件,當它應該返回字符串。問題是,數字類型優先於字符串類型,因此,SQL Server將嘗試將字符串消息轉換爲數字(並失敗)。

爲了避免這種情況,你應該確保你所返回的所有數值正確地轉換爲字符串,然後你可以很容易地添加任何你想要的消息來代替零。

另一件事,你的四捨五入技術似乎對我來說過於複雜。如果你想收集,只需使用CEILING()。如果你想四捨五入到最接近的0.25,你可以乘以4,適用CEILING(),然後由4

分這是我嘗試在說明我的意思:

WITH data (totaleffort) AS (
    SELECT CAST(123.5 AS float) UNION ALL 
    SELECT 88 UNION ALL 
    SELECT 0.067 UNION ALL 
    SELECT 0 UNION ALL 
    SELECT 9608.14 
) 
SELECT 
    ISNULL(
    CAST(CAST(NULLIF(CEILING(totaleffort * 4/7.40)/4, 0) AS decimal(10, 2)) AS nvarchar(30)), 
    'unknown number' 
) 
FROM data 

輸出:

------------------------------ 
16.75 
12.00 
0.25 
unknown number 
1298.50 

您還可以看到,我在此處使用ISNULL()NULLIF()以用自定義文本替換0。它的工作原理是這樣的:

  • 計算結果傳遞給NULLIF其第二個參數是0 - 這意味着,如果結果爲0NULLIF將返回NULL,否則將返回的結果;

  • 現在ISNULL做相反的事情:如果第一個參數是NULL,則返回第二個參數,否則返回第一個參數。

因此,通過這個轉換鏈,零有效地變爲'unknown number'

1

假設你想添加時,你的病情的值是0,他們不喜歡這樣寫道:

CASE 

WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))=0 THEN 
"unknown number" 


WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))> 0 AND (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))<=0.25 THEN (0.25+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar))) 

WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))> 0.25 AND (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))<=0.50 THEN (0.50+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar))) 

WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))> 0.50 AND (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))<=0.75 THEN (0.75+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar))) 

WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))> 0.75 AND (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))<1 THEN (1+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar))) 


WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))= 0 THEN (0+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar))) 

END 

AS Estimated_Effort_Days, 
+0

仍然收到錯誤: 消息8114,級別16,狀態5,行2 將數據類型nvarchar轉換爲float時出錯。 – JsonStatham 2012-02-28 13:41:03

+0

用我的編輯再試一次。如果它不起作用,請在您的問題中輸入所有查詢(或sp,如果是這種情況)。 – 2012-02-28 14:26:03

1

你不能期望有一個列,其中有時值爲VARCHAR和等時間浮動,所以你可以將整個結果轉換成THEN爲nvarchar,如:

CASE 
    WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))=0 
    THEN cast('unknown number' as nvarchar) 
    WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))> 0 AND (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))<=0.25 
    THEN CAST((0.25+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar))) as nvarchar) 

看看最後一行

+0

這不起作用 – JsonStatham 2012-02-28 13:39:02

+0

它給出了相同的錯誤還是你沒有得到預期的輸出? – Vikram 2012-02-28 13:49:17

0

爲什麼不乾脆:

WHEN CONVERT(DECIMAL(10,2),(totaleffort/7.40)) - FLOOR(CONVERT(DECIMAL(10,2),(totaleffort/7.40)))) = 0 THEN 'unknown number' 

的觀察:

你爲什麼不改變(expression) > 0 and (same expression) <=0.25(expression) between 0 and 0.25

您所計算同一表達式兩次無故

0

我注意到的是,提供的答案都在「何時」的子句的一部分而不轉換比較值爲nvarchar做轉換的第一個例子以及。這可能是爲什麼你仍然看到提供的代碼錯誤。我建議你將數據類型單獨留在'When'子句中(看起來「正確的」比較是數字的),但所有的'Then'/'Else'結果都需要轉換爲字符類型爲SQL不能在同一列中混合和匹配數據類型。

只是有點額外的輸入......超出了問題的範圍,我意識到:-)如果這是報告,我建議改變報告界面而不是改變SQL。將數據類型單獨保留在視圖/過程/函數級別將使數據結構更具可重用性/可擴展性,並且應使用零值的計算/聚合將按預期行爲,而不必「反向轉換」。如果你必須改變SQL端而不是接口端,我建議在SQL端結構中包括'report pretty'和'actual value'列,這樣你就不會因爲刪除零值而失去任何功能,改變數據類型。

相關問題