SQL 服务器:SUM () 仅用于数值,忽略 Varchar 值

SQL Server : SUM () for only numeric values, ignoring Varchar values

我在学习时需要一些帮助 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

我不擅长解释事情,但我希望你能理解我正在努力做的事情。

如果这个问题已经得到解答,请告诉我这个问题的方向,我对此深表歉意。非常感谢:)

只需将 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.

您可以通过添加 0 "ignore" 一行。

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

尝试

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

假设你的字段是varchar类型

为什么不使用 TRY_CONVERT:

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

最短查询且易于阅读! TRY_CONVERT returns 如果转换失败则为 NULL(例如,如果 Column1 中有文本值)

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

@Jim Chen:

Isnumeric在这一点上有点棘手!在您的解决方案中,如果值“-”或“+”位于列内,则会出现问题:

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

==> SUM 将失败!