CAST, SUM, CASE Проблемы - PullRequest
       9

CAST, SUM, CASE Проблемы

1 голос
/ 22 марта 2019

Я пытаюсь учесть в своей базе данных несколько неконтролируемых значений, которые содержат строку «unknown», я хочу установить для них значение 0, а затем суммировать остальные.Но по какой-то причине этого не происходит.Вот то, что у меня есть -

Значения - VARCHAR (30) -

     3
     0.1
     2
     16
     2
     5
     2
     Unknown
     2.4
     7
     Unknown  

А вот мой бросок, Сумма, Дело

Cast(sum(case when stake = 'Unknown' then 0 else stake end) as float) as totalStake

Но я получаю этоошибка - преобразование не удалось преобразовать значение varchar '0.1' в тип данных int.

Справка!

Спасибо

Ответы [ 5 ]

3 голосов
/ 22 марта 2019

Вы должны разыграть кол как поплавок:

sum(case when stake = 'Unknown' then 0.0 else cast(stake as float) end) as totalStake
1 голос
/ 22 марта 2019

Вы можете попробовать следующий запрос, используя i snumeric() для проверки числовых данных.

create table temp (stake VARCHAR(30))
insert into temp values
('3'), ('0.1'), ('2'), ('16'), ('2'), ('5'), ('2'), ('Unknown'), ('2.4'), ('7'), ('Unknown')

--Select * from temp

Select sum(Cast(stake as Float)) from temp where isnumeric(stake) = 1

Для обработки некоторых исключений, таких как null значения или . только значения, вы можете попробовать это

Select SUM(TRY_CAST(stake as Float)) from temp

Вы можете найти живое демо Здесь .

1 голос
/ 22 марта 2019

Первым шагом было бы заменить строку «Неизвестно» на 0, используя функцию замены, а затем преобразовать тип данных столбца в тот, который позволяет выполнять агрегирующие функции, а затем выполнять SUM поверх этого.Приведенный ниже запрос будет работать только для «неизвестной» строки. Если у вас есть другие строки, отличные от «неизвестного», вам, возможно, придется выбрать другой подход, например, использовать IsNumeric в функции Replace и обновить строковое значение до 0.

select sum(cast((REPLACE(stake,'unknown',0))  as float)) from table
1 голос
/ 22 марта 2019

Вы должны явно преобразовать в какой-либо тип числовых значений. Попробуйте это:

sum(try_convert(numeric(18, 4), stake)) as totalStake

Ваш код имеет как минимум две проблемы. Во-первых, ваше case выражение возвращает целое число (потому что первое then имеет целое число). Таким образом, он пытается преобразовать stake в целое число, что может привести к ошибке.

Во-вторых, вы должны выполнять арифметические операции с данными, которые явно являются типом чисел и не зависят от неявного преобразования.

0 голосов
/ 22 марта 2019

Это происходит потому, что у SQL есть некоторые проблемы при преобразовании десятичных значений в целочисленные значения.Фактически, функция sum возвращает целочисленные значения

enter image description here

Я решил это с помощью функции округления для переменной values1 (извините за использование того же имени для таблицы иколонка):

 select Cast(sum(case when values1 = 'Unknown' then 0 else round(values1, 2) end)  as 
 float)as totalstrike
 from values1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...