2015-06-12 2 views
-1

У меня есть таблица с a1 и a2 столбцов с плавающей точкой,Найдите столбец с десятичным значением для '.'

Значения в а2 вычисляются из a1, а а2 = 3 * a1

условие:

Если значение в А1 9.5, мне нужно получить значение потолка в a2 , т. Е. Если числовое значение после десятичной точки больше или равно 5, мне нужно получить значение потолка, иначе мне нужно получить значение пола.

я написал ниже запрос

SET a2 =(case when substring(cast((a1 * 3) as varchar(6)),CHARINDEX('.',(a1*3)),1) >=5 then CEILING(a1 * 3) else FLOOR(a1 * 3) end) from table 

, но, очевидно, возвращает ошибку ниже:

преобразования не удалось при преобразовании значения VARCHAR «» к типу данных int.

Так как он не может принимать варчар в потолок или пол.

Есть ли способ, которым я могу достичь этого?

Ваша помощь будет принята с благодарностью.

Значение a2 продолжает изменяться в зависимости от a1, если a1 равно 4,5 a2, если это потолок, если a1 равен 4.9 a2, должно быть снова значение потолка, но если a1 - это что-то ниже 4.5 в качестве 4.3.4.2.4.1, то оно должно значение пола

Любой другой подход для этого также будет выполняться, кроме потолка и пола.

+0

Поместите конверт внутри потолка и пола – artm

+0

Пожалуйста, отредактируйте этот вопрос и предоставите данные образца и желаемые результаты. Могут быть лучшие способы сделать то, что вы хотите. –

+0

как @GordonLinoff ответил, что вы описываете, что делает функция ROUND. – 1010

ответ

0

Это потому, что вы пытаетесь сравнить VARCHAR> = 5, отлитый его INT:

SET a2 =(case when cast(substring(cast((a1 * 3) as varchar(6)),CHARINDEX('.',(cast((a1 * 3) as varchar(6))),1) as INT) >=5 then CEILING(a1 * 3) else FLOOR(a1 * 3) end) from table 
+0

Я все еще получаю ту же ошибку – LOL

+0

Попробуйте сейчас. Обновленный ответ. –

2

Как насчет использования round()? Он реализует эту логику непосредственно в базе данных:

set a2 = round(a1, 0); 

Альтернативный метод заключается в вычитает 0,5:

set a2 = floor(a1 + 0.5) 

Если вы хотите a2 как значение строки (вы говорите, что вы хотите с плавающей точкой, но возвращается код строка), а затем использовать str():

set a2 = str(a1) 

str() раундов по умолчанию.

+0

если я использую раунд (4.5,1), он дает мне 4.5, но для раунда (4.9) мне нужно 5, а не 4.9 – LOL

+1

использовать раунд (4.5). он должен округлить ваш номер. – 1010

+0

Значение a2 продолжает изменяться в зависимости от a1, если a1 равно 4,5 a2, если это потолок, если a1 равен 4.9 a2, должно быть снова значение потолка, но если a1 - это что-то ниже 4.5 в качестве 4.3.4.2.4.1, то это должен быть пол Значение – LOL

Смежные вопросы