Искать столбец с десятичным значением для "."
У меня есть таблица с плавающими столбцами a1 и a2,
Значения в a2 рассчитываются по a1, так как a2 = 3*a1
Состояние:
Если значение в a1 равно 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.
С тех пор, не могу взять varchar в потолок или пол.
Есть ли способ, которым я могу достичь этого?
Ваша помощь будет принята с благодарностью.
Значение a2 продолжает меняться в зависимости от a1, если a1 равно 4,5, a2 должно превышать это значение, если a1 равно 4,9, a2 должно быть снова верхним значением, но если a1 ниже 4,5, как 4.3,4.2,4.1, то это должно быть минимальное значение.
Любой другой подход для этого также подойдет, кроме потолка и пола.
2 ответа
Как насчет использования round()
? Он реализует эту логику прямо в базе данных:
set a2 = round(a1, 0);
Альтернативный метод - вычесть 0,5:
set a2 = floor(a1 + 0.5)
Если ты хочешь a2
в качестве строкового значения (вы говорите, что хотите использовать float, но код возвращает строку), затем используйте str()
:
set a2 = str(a1)
str()
раунды по умолчанию.
Это потому, что вы пытаетесь сравнить 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