SQL Server:忽略SUM函数中的字符串

时间:2014-07-22 08:35:43

标签: sql sql-server sql-server-2012 sum

我在列上执行sum功能。但该列也可以包含字符串值。我希望SQL Server忽略字符串值并仅对字符串值求和。

例如:列的值可以是16000Euro或2588或3671.

输入来自用户,我无法将应用中的验证更改为整数

我试过这个,但仍然显示错误:

SUM(CASE WHEN Type_New = 202 AND ISNUMERIC(Summe) = 1 
       THEN Summe 
       ELSE 0 
    END) AS total_Euro

那么在进行求和操作时如何忽略字符串值呢?

我得到的错误是:

  

转换nvarchar值' 2588时出错。 '在int数据类型中。

编辑:我希望SQL忽略这样的字符串值并总结它能做什么..主要目的是Query不应该抛出任何错误

6 个答案:

答案 0 :(得分:1)

尝试以下查询,它将完美地工作:)

   SELECT SUM(CASE WHEN Type_New = 202 AND ISNUMERIC(Summe + '.0e0') = 1 
           THEN Summe 
           ELSE 0 
        END) AS total_Euro FROM TableName

如果varchar值可以转换为任何数字类型(包括int,bigint,decimal,numeric,real& float),则IsNumeric返回1如1e4,1。,2.0这样的值将创建问题,如果以上检查绕过这些值没有添加。

答案 1 :(得分:0)

您不应该将列命名为与SQL Server中的关键字相同,如果无法避免这种情况,您可以通过将方括号[Sum]括起来来转义列名,如下所示

SELECT SUM(CASE WHEN Type = 202 AND ISNUMERIC([Sum]) = 1 THEN [Sum] ELSE 0 END) AS total_Euro

答案 2 :(得分:0)

试试这个

SUM(CASE WHEN Type = 202 AND case when Sum not like '%[^0-9]%' THEN Sum END ELSE 0 END) AS total_Euro

SUM(CASE WHEN Type = 202 AND ISNUMERIC(Sum+'.e0') = 1 THEN Sum ELSE 0 END) AS total_Euro

答案 3 :(得分:0)

试试这个:

SUM (CASE 
     WHEN Type_New = 202 AND ISNUMERIC(Summe) = 1 THEN CAST(summe AS DECIMAL(9,2))
     ELSE 0 END) AS TotalEuro

答案 4 :(得分:0)

我不知道你是为一列做了这个SUM还是什么,但你也可以过滤掉你需要的东西然后总结:

SELECT SUM(Summe) AS total_Euro
FROM someTable
WHERE Type_New = 202 AND ISNUMERIC(Summe) = 1

答案 5 :(得分:0)

ISNUMERIC函数考虑包含large numeric的字符串(例如,9223372036854775808),decimals(例如,12.4),currency figures(例如,$ 123)和{{1 (例如,1E2)是可以转换为数字数据类型的字符串。

现在要计算floating-point values,您必须将Sum转换为string [此假设基于 您已发布的示例数据]但事实是字符串可以是数字但可能无法转换为整数; ISNUMERIC函数的限制在于它只能告诉您字符串是否可以转换为任何数字数据类型。

因此,如果您的专栏没有integer1E312.4$123但不是numeric的字符串数据,那么您可以简单地如下所示将目标列转换为int并计算总和:

integers

否则你应该去寻找一个更通用的功能,如下所述。 http://sqlmag.com/t-sql/can-i-convert-string-integer