sql sum + varchar

时间:2012-05-25 09:21:51

标签: sql

我的sql表(SQL 2008)中有varchar类型列用于存储学生标记。如果我只存储标记,我可以通过将列转换为整数来计算标记的总和。

但我需要为缺席者存储Absent。现在,在插入Absent后,在转换为整数并将值加总时,Absent显示错误。

是否可以只对标记求和,并排除Absent?我试过这样

select sum(cast(Marks as integer))
from Results    
group by Marks

7 个答案:

答案 0 :(得分:2)

无需添加Group by条款。

在聚合函数中使用的除了列之外的其他列中没有其他列,则不需要GROUP BY。

select sum(cast(Marks as integer))
from Results    
where Marks <>'Absent'

答案 1 :(得分:2)

您应该为Marks使用整数列,并且您应该有一个自己的列用于Absent。

要修复当前情况,您可以使用case声明。

select sum(case Marks when 'Absent' then 0 else Marks end)

答案 2 :(得分:1)

select sum(cast(Marks as integer))
from Results
where Marks <> 'Absent'

只需添加一个where子句!

答案 3 :(得分:1)

使用解码功能 -

select sum(decode(Marks, 'Absent', 0, cast(Marks as integer)))

答案 4 :(得分:1)

也许是这样的?

select sum(cast(Marks as integer))
from Results
where Marks <> 'Absent'

答案 5 :(得分:1)

假设列中没有Absent。 试试这个 -

select sum(IF(Marks = 'Absent', 0, cast(Marks as integer))) -- MySQL
select sum(decode(Marks, 'Absent', 0, cast(Marks as integer))) -- Oracle
from Results    
group by Marks;

OR

select sum(cast(Marks as integer))
from Results
where Marks <> 'Absent'
group by Marks

答案 6 :(得分:0)

哇,我在SQL Server中的首选解决方案就是:

select sum(case when isnumeric(Marks) = 1 then cast(Marks as Integer) end)
from Results

或等同地:

select cast(Marks as Integer)
from Results
where isnumeric(Marks) = 1

除非您尝试生成直方图,否则不需要分组。

顺便说一句,上面仍然容易出错,因为浮点数不能安全地转换为整数。您可能更喜欢:

select cast(sum(case when isnumeric(Marks) = 1 then cast(Marks as float) end) as int)
from Results