我试图容纳数据库中包含字符串'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时转换失败。
帮助!
谢谢
答案 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)