我的sql表(SQL 2008)中有varchar类型列用于存储学生标记。如果我只存储标记,我可以通过将列转换为整数来计算标记的总和。
但我需要为缺席者存储Absent
。现在,在插入Absent
后,在转换为整数并将值加总时,Absent
显示错误。
是否可以只对标记求和,并排除Absent
?我试过这样
select sum(cast(Marks as integer))
from Results
group by Marks
答案 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