2014-09-03 101 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 
相关问题