SQL 服务器:SUM () 仅用于数值,忽略 Varchar 值
SQL Server : SUM () for only numeric values, ignoring Varchar values
我在学习时需要一些帮助 SQL 所以我处于初学者水平。我正在使用 SQL Server 2008 R2。
我的问题是:我想(添加)汇总具有 varchar
和 decimal
混合值的列。我想忽略 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
您可以通过添加 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 将失败!
我在学习时需要一些帮助 SQL 所以我处于初学者水平。我正在使用 SQL Server 2008 R2。
我的问题是:我想(添加)汇总具有 varchar
和 decimal
混合值的列。我想忽略 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
您可以通过添加 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 将失败!