2014-09-03 103 views
0

我正試圖解決以下代碼中出現的此錯誤消息「將數據類型varchar轉換爲float時出錯」。我嘗試了很多方法,第一條線已經奏效。我認爲問題是表中有一個NULL。此次數據類型爲float將數據類型varchar轉換爲float case case語句時出錯

SELECT 
    'May' as Month_Name -- have this for all table months that I pull data from. 
    , SUM(
     CASE 
     WHEN [All Gaps Mar] = '-' THEN 0 
     ELSE [All Gaps Mar] 
     END 
    ) AS AllGapsFeb -- works with Integer on column in other tables 
    , SUM(
     CASE 
     WHEN coalesce([All Gaps Mar], 0) = '-' THEN 0 
     ELSE [All Gaps Mar] 
     END 
    ) AS AllGapsMarch 

下面是其他企圖得到它從我發現SO和互聯網工作,但我得到了同樣的錯誤:

, SUM(
     CASE 
     WHEN [All Gaps Mar] = '-' THEN convert(integer, [All Gaps Mar]) 
     ELSE ([All Gaps Mar]) 
     END 
    ) AS AllGapsMarch 
    , SUM(
     CASE 
     WHEN [All Gaps Mar] = '-' THEN 0 
     ELSE convert(integer, [All Gaps Mar]) 
     END 
    ) AS AllGapsMarch 
    , CASE 
     WHEN [All Gaps Mar] = '-' 
     THEN ISNUMERIC(convert(integer, Sum([All Gaps Mar]))) 
     ELSE 0 
     END AS numeric_count 
+0

,你爲什麼和0做coalese並用字符串比較結果? – 2014-09-03 18:02:41

+0

你可以檢查你的專欄以外的任何非數字值嗎?只要列中的字母字符不能變成數字,就可能發生錯誤。 – Vulcronos 2014-09-03 18:04:28

+0

這是什麼意思:「 - <在其他表中的列上使用整數」?嘗試刪除SUM()並查看您嘗試進行SUM操作的數據。有沒有不是數字或NULL的行? – 2014-09-03 18:04:55

回答

0

在SQL Server 2008及以上:

SELECT 
    AllGapsMarch = Sum(Coalesce(Try_Convert(float, [All Gaps Mar])), 0) 

在SQL Server 2005:

SELECT 
    AllGapsMarch = Sum(Convert(float, Coalesce(N.[All Gaps Mar]), 0)) 
FROM 
    #adhoc A 
    OUTER APPLY (
     SELECT [All Gaps Mar] WHERE IsNumeric(A.[All Gaps Mar] + 'E0') = 1 
    ) N 

在SQL Server 2000和更早的版本:

SELECT 
    AllGapsMarch = Sum(Convert(float, (
     CASE 
     WHEN IsNumeric([All Gaps Mar] + 'E0') = 1 THEN [All Gaps Mar] 
     ELSE 0 
     END 
    )) 

我有要說在月份中存儲月份名稱並不是最好的ctice。該月份應該是列中的值,而不是每個月都有一列,然後僅在最後一刻,表示層纔可以將結果進行透視以提供列中每個月的值。

這裏有一個查詢挑起關於unpivoting可怕個月爲 - 獨立柱範式一些思考:

SELECT 
    G.MonthNumber, 
    [All Gaps] = Coalesce(Sum(N.ConvertableValue), 0) 
FROM 
    #adhoc A 
    CROSS APPLY (VALUES 
     ('1', [All Gaps Jan]), 
     ('2', [All Gaps Feb]), 
     ('3', [All Gaps Mar]), 
     ('4', [All Gaps Apr]), 
     ... and so on 
    ) G (MonthNumber, StringValue) 
    OUTER APPLY (
     SELECT G.Value 
     WHERE IsNumeric(G.Value + 'E0') = 1 
    ) N (ConvertableValue) 
; 
+0

感謝您的幫助。你最近對可怕月份的評論很有趣。 :)。它變得更糟了。我使用這種方法,因爲我必須使用每個月的表格來運行這個龐大的報告,然後總結每個月的所有細節,並比較每月的170+列excel報告。這就是爲什麼我使用Month_Name來獲取每個報表月份表的總和。爲什麼他們把這個存儲爲float,我不知道。儘管它是一個痛苦。 – user3933707 2014-09-04 15:07:56

+0

我回答了你的問題嗎?大約幾個月 - 我支持我的評論。總結幾個月未分派的時候就像分組一樣簡單,比較幾個月就像減去正確的數量或'DateAdd(month,-1,MonthDate)'一樣簡單。 – ErikE 2014-09-04 19:49:10

+0

是的,你做到了。對不起忘了提到這一點。 – user3933707 2014-09-05 18:15:55

0

想,當我遇到了同樣的錯誤重現這一點,但意識到我的問題是由於試圖填充我的虛擬數據引起的 - 原始版本的SELECT ... UNION將所有浮點值都視爲數字,所以我在做SELECT 101,SELECT 16.6等等。嘗試使用UNION float和varchar數據而不使用CAST來確保它們都是相同類型或用引號將數字括起來,這些信息給我提供了與您所看到的相同的消息...使用類似下面的查詢的方式獲得您所需的信息?

CREATE TABLE #adhoc ([All Gaps Mar] varchar(20),OtherField varchar(20)) 

INSERT INTO #adhoc 
SELECT '101','ABC' 
UNION 
SELECT '16.6','123' 
UNION 
SELECT '3.14','May' 
UNION 
SELECT 'Not Numeric','March' 
UNION 
SELECT '42.0','Feb' 
UNION 
SELECT 'abc','Test' 

SELECT 'May' as Month_Name, 
SUM(CASE WHEN ISNUMERIC([All Gaps Mar])=1 THEN CAST([All Gaps Mar] AS float) ELSE 0 END) Total 
FROM #adhoc 

/* alternate approach */ 
SELECT 'May' Month_Name, SUM(CAST([All Gaps Mar] as float)) 
FROM 
(
SELECT [All Gaps Mar] FROM #adhoc WHERE ISNUMERIC([All Gaps Mar])=1 
) tmp 

DROP TABLE #adhoc 
相關問題