2012-05-25 2 views
0

У меня есть столбец типа varchar в моей таблице sql (SQL 2008) для хранения оценок учащихся. Если я сохраняю только метки, я могу вычислить сумму меток, переведя столбец в целое.sql sum + varchar

Но мне нужно хранить Absent для отсутствующих. И теперь его ошибка отображения в том, что Absent при литье в целое число и суммирование значения после вставки Absent.

Можно ли суммировать только знаки, и за исключением Absent? Я попытался как этот

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

Это очень плохой дизайн. Я бы использовал столбец «Marks INT» и оставил его «NULL», когда ученик отсутствовал. Таким образом, вы можете (а) легко суммировать свои оценки (поскольку это уже «INT»), а те записи с «NULL» - это те, в которых ученик отсутствовал, - нет необходимости хранить это как столбец «Varchar», действительно .... –

+0

Вы правы marc_s, но мне также нужно обращаться с Absentees, вот что. так или иначе допустим null также – shanish

+0

'Marks IS NULL' -> absentee - не работает? Или если нет: добавьте столбец 'BIT'' IsAbsentee', но ** не ** храните что-то вроде этого как 'varchar'! –

ответ

2

Нет необходимости добавлять Group by статьи.

Никаких других столбцов в разделе Выбрать, кроме столбца, используемого в функции агрегации, тогда нет необходимости иметь GROUP BY.

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

greatttt, его работа, спасибо romil – shanish

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

Просто добавьте где положение!

+0

отлично, но его не суммируя значение – shanish

+0

Я просто добавил предложение where к вашему первоначальному запросу - он, вероятно, сработает нормально, просто удалив 'group by' пункт. Я отредактирую. – Bridge

+0

thanks Bridge, его работа теперь – shanish

1

использование функции декодирования, как -

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

это говорит, что если mark = 'Absent', тогда добавьте 0 еще добавить метки – Addicted

+0

Я думал, что так делаю, но я не знал, как это сделать, спасибо за ответ urhinav, я проверю это ошибка – shanish

+0

, так как «декодирование» не является признанным встроенным именем функции ». – shanish

1

Может что-то вроде этого?

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

спасибо Питер, не используя здесь группу, его рабочий – shanish

2

Вы должны использовать целочисленный столбец для Marks и вы должны иметь столбец свой собственный для Absent.

Чтобы исправить вашу текущую ситуацию, вы можете использовать оператор case.

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

спасибо Mikael, его работа – shanish

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 
+0

благодарит Juniad, я использую Sql 2008 и в ur 2-ом решении, не используя группу, ее работу – shanish

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 

группа by noeces sary, если вы не пытаетесь создать гистограмму.

Между прочим, вышесказанное по-прежнему подвержено ошибкам, поскольку числа с плавающей запятой не могут быть безопасно преобразованы в целые числа. Вы можете предпочесть:

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