我的 sql 表(SQL 2008)中有用于存储学生分数的 varchar 类型列。如果我只存储标记,我可以通过将列转换为整数来计算标记的总和。
但我需要Absent
为缺勤者储存。现在,它Absent
在转换为整数并对值求和时显示错误,插入Absent
.
是否可以只总结分数,不包括Absent
?我试过这样
select sum(cast(Marks as integer))
from Results
group by Marks
我的 sql 表(SQL 2008)中有用于存储学生分数的 varchar 类型列。如果我只存储标记,我可以通过将列转换为整数来计算标记的总和。
但我需要Absent
为缺勤者储存。现在,它Absent
在转换为整数并对值求和时显示错误,插入Absent
.
是否可以只总结分数,不包括Absent
?我试过这样
select sum(cast(Marks as integer))
from Results
group by Marks
你应该使用一个整数列,Marks
并且你应该有一个自己的列来表示缺席。
要解决您当前的情况,您可以使用case
语句。
select sum(case Marks when 'Absent' then 0 else Marks end)
无需添加Group by
子句。
除了聚合函数中使用的列之外,Select 中没有其他列,因此不需要 GROUP BY。
select sum(cast(Marks as integer))
from Results
where Marks <>'Absent'
使用解码功能 -
select sum(decode(Marks, 'Absent', 0, cast(Marks as integer)))
也许是这样的?
select sum(cast(Marks as integer))
from Results
where Marks <> 'Absent'
假设缺席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;
或者
select sum(cast(Marks as integer))
from Results
where Marks <> 'Absent'
group by Marks
select sum(cast(Marks as integer))
from Results
where Marks <> 'Absent'
只需添加一个 where 子句!
哇,我在 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
group by 是不必要的,除非您尝试生成直方图。
顺便说一句,上面仍然容易出错,因为浮点数不能安全地转换为整数。您可能更喜欢:
select cast(sum(case when isnumeric(Marks) = 1 then cast(Marks as float) end) as int)
from Results