1

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

但我需要Absent为缺勤者储存。现在,它Absent在转换为整数并对值求和时显示错误,插入Absent.

是否可以只总结分数,不包括Absent?我试过这样

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

7 回答 7

2

你应该使用一个整数列,Marks并且你应该有一个自己的列来表示缺席。

要解决您当前的情况,您可以使用case语句。

select sum(case Marks when 'Absent' then 0 else Marks end)
于 2012-05-25T09:25:49.277 回答
2

无需添加Group by子句。

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

select sum(cast(Marks as integer))
from Results    
where Marks <>'Absent'
于 2012-05-25T09:25:00.607 回答
1

使用解码功能 -

select sum(decode(Marks, 'Absent', 0, cast(Marks as integer)))
于 2012-05-25T09:25:35.757 回答
1

也许是这样的?

select sum(cast(Marks as integer))
from Results
where Marks <> 'Absent'
于 2012-05-25T09:25:36.957 回答
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;

或者

select sum(cast(Marks as integer))
from Results
where Marks <> 'Absent'
group by Marks
于 2012-05-25T09:26:44.830 回答
1
select sum(cast(Marks as integer))
from Results
where Marks <> 'Absent'

只需添加一个 where 子句!

于 2012-05-25T09:25:10.780 回答
1

哇,我在 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
于 2012-05-25T13:32:00.990 回答