在case语句中将数据类型varchar转换为float时出错

时间:2014-09-03 17:54:34

标签: sql sql-server

我正在尝试解决此错误消息"将数据类型varchar转换为float"在下面的代码中。我尝试了很多方法,这第一行已经奏效了。我认为问题是表中有一个NULL。此次数据类型也是float

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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
   ))

我不得不说在列中存储月份名称不是最佳做法。月份应该是列中的值,而不是每个月有一列,然后只有在最后一刻,表示层才能转动结果,以便在列中提供每个月的值。

这是一个问题,引发了一些关于将可怕的月份作为单独列的范例进行疏忽的想法:

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)
;