SQL Server:SUM()仅用于数值,忽略Varchar值

时间:2015-03-02 07:32:31

标签: sql sql-server-2008-r2

我在学习SQL时需要一些帮助,所以我处于初级水平。我正在使用SQL Server 2008 R2。

我的问题是:我想(添加)总结一个混合值为varchardecimal的列。我想忽略varchar值并仅将decimal加起来。我的专栏是这样的:

Column1  
-------
0.1  
Z  
0.4  
2.1  
2.1  
Z

我需要在这种情况下的总和应该是:4.7

我尝试使用CASE但我未能解决它

SELECT 
    SUM(CASE 
           WHEN ISNUMERIC(Column1) = 1 
              THEN .(if true how i add them?). 
              ELSE .(and if false how i ignore them?). 
         END) AS Total 
FROM
    TABLE_Name

我不善于解释事情,但我希望你能理解我想要做的事情。

如果这个问题已经得到解答,请告诉我这个问题的方向和我对此的说明......非常感谢提前:)

4 个答案:

答案 0 :(得分:6)

只需将WHERE子句与CAST

一起使用即可
SELECT SUM(Cast(Column1 as numeric(10,2))) as Total
FROM TABLE_Name
Where IsNumeric(Column1) = 1 

结果:

TOTAL
4.7

SQL Fiddle中的示例结果。

修改

正如@funkwurm指出的那样,该专栏有机会获得价值'。' (点):

SELECT SUM(Cast(Column1 as numeric(10,2))) as Total
FROM TABLE_Name
Where IsNumeric(Column1 + 'e0') = 1 

Fiddle

答案 1 :(得分:0)

您可以通过添加0来“忽略”一行。

SELECT
    SUM(
        CASE
            WHEN ISNUMERIC(Column1)=1 THEN CONVERT(DECIMAL(10,5), Column1) --add the value to the sum
            ELSE 0 --add 0 (i.e. ignore it)
        END)
    AS Total
FROM
    TABLE_Name

答案 2 :(得分:0)

select sum(case when isnumeric(cast(Column1 as decimal)) 
then cast(column1 as decimal) else 0 end) as total from table

假设您的字段是varchar类型

答案 3 :(得分:0)

为什么不使用TRY_CONVERT:

SELECT SUM(TRY_CONVERT(float,Column1) AS Total
FROM TABLE_Name

查询最短,易读!如果转换失败(例如,如果Column1中有文本值)

,则TRY_CONVERT返回NULL

此功能自SQL Server 2012以来就存在(我认为)。

@Jim Chen:

在这一点上,Isnumeric有点棘手!在您的解决方案中,如果值为' - '或' +'在列中:

SELECT ISNUMERIC('+')    --returns TRUE!
SELECT ISNUMERIC('-')    --returns TRUE!

<强> ==&GT; SUM将失败!