CAST,SUM,CASE问题

时间:2019-03-22 11:13:25

标签: sql sql-server case

我试图容纳数据库中包含字符串'unknown'的一些流氓值,我想将它们设置为0,然后将其余部分求和。但是由于某种原因,这没有发生。这就是我所拥有的-

值-VARCHAR(30)-

     3
     0.1
     2
     16
     2
     5
     2
     Unknown
     2.4
     7
     Unknown  

这是我的演员表,总和,案件

Cast(sum(case when stake = 'Unknown' then 0 else stake end) as float) as totalStake

但是我收到此错误-将varchar值'0.1'转换为数据类型int时转换失败。

帮助!

谢谢

5 个答案:

答案 0 :(得分:3)

您必须将股份作为浮动资金投入

sum(case when stake = 'Unknown' then 0.0 else cast(stake as float) end) as totalStake

答案 1 :(得分:1)

您应该显式转换为某种数值。试试这个:

sum(try_convert(numeric(18, 4), stake)) as totalStake

您的代码至少有两个问题。首先,您的case表达式返回一个整数(因为第一个then具有一个整数)。因此,它将尝试将stake转换为整数,这会产生错误。

第二,您应该对显式某种数字类型的数据进行算术运算,并且不依赖于隐式转换。

答案 2 :(得分:1)

初始步骤是使用替换函数将'Unknown'字符串替换为0,然后将列数据类型转换为允许执行聚合函数的数据类型,然后在其上执行SUM。以下查询仅适用于“未知”字符串,如果除“未知”之外还有其他字符串,则可能必须选择其他方法,例如在Replace函数中使用IsNumeric并将字符串值更新为0。

select sum(cast((REPLACE(stake,'unknown',0))  as float)) from table

答案 3 :(得分:1)

您可以尝试使用i snumeric()进行以下查询,以检查数字数据。

create table temp (stake VARCHAR(30))
insert into temp values
('3'), ('0.1'), ('2'), ('16'), ('2'), ('5'), ('2'), ('Unknown'), ('2.4'), ('7'), ('Unknown')

--Select * from temp

Select sum(Cast(stake as Float)) from temp where isnumeric(stake) = 1

要仅处理null值或.值之类的异常,您可以尝试

Select SUM(TRY_CAST(stake as Float)) from temp

您可以找到实时演示Here

答案 4 :(得分:0)

发生这种情况是因为SQL在将十进制值转换为整数值时遇到了一些问题。 实际上,函数sum返回整数值

enter image description here

我在values1变量上使用了舍入功能(对于表和列使用相同的名称)解决了这个问题:

 select Cast(sum(case when values1 = 'Unknown' then 0 else round(values1, 2) end)  as 
 float)as totalstrike
 from values1