Как получить результат с плавающей точкой, разделив два целых значения с помощью T-SQL?

173

Используя T-SQL и Microsoft SQL Server, я хотел бы указать количество десятичных цифр, когда делаю 2 целых числа, например:

select 1/3

Это в настоящее время возвращается 0. Я хотел бы, чтобы это вернулось 0,33.

Что-то вроде:

select round(1/3, -2)

Но это не работает. Как я могу достичь желаемого результата?

LaBracca
источник
3
Вы пробовали 1.0 / 3?
Тило
Ответов, которые я получил, более чем достаточно
LaBracca

Ответы:

277

Предложения от stb и xiowl хороши, если вы ищете константу. Если вам нужно использовать существующие поля или параметры, которые являются целыми числами, вы можете сначала привести их к плавающим значениям:

SELECT CAST(1 AS float) / CAST(3 AS float)

или

SELECT CAST(MyIntField1 AS float) / CAST(MyIntField2 AS float)
Ричард
источник
Или вы можете использовать их как десятичные дроби, если хотите получить десятичный результат.
Тим
30
ВЫБРАТЬ 1.0 * MyInt1 / MyInt2
Трогло
@TroubleZero для использования MySQLdecimal
itazzad
Большое спасибо, вы спасли мой день. Меня судили CAST (7/3 AS float), но снова вернули 2. Так что приведение числа решило мою проблему.
Ясин Йорук
3
не нужно разыгрывать и дивиденд, и делитель, см. ответ
@MS
70

Потому что SQL Server выполняет целочисленное деление. Попробуй это:

select 1 * 1.0 / 3

Это полезно, когда вы передаете целые числа в качестве параметров.

select x * 1.0 / y
xiaowl
источник
1
Вы даже можете опустить нули.
Джон
43

Нет необходимости разыгрывать их обоих. Тип данных результата для подразделения всегда тот, который имеет более высокий приоритет типа данных . Таким образом, решение должно быть:

SELECT CAST(1 AS float) / 3

или

SELECT 1 / CAST(3 AS float)
РС
источник
27

использование

select 1/3.0

Это сделает работу.

БВ
источник
13

Я понимаю, что CASTING FLOATне разрешен в MySQL и выдает ошибку при попытке, CAST(1 AS float)как указано в MySQL Dev .

Обходной путь к этому прост. Просто сделать

(1 + 0.0)

Затем используйте ROUNDдля достижения определенного количества десятичных знаков, таких как

ROUND((1+0.0)/(2+0.0), 3)

Вышеприведенный SQL делит 1 на 2 и возвращает число с плавающей запятой с 3 десятичными знаками, как в этом случае 0.500.

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

Верховный Дельфин
источник
3
MySQL разрешает CAST, просто не разрешает приведение к FLOAT. Транслировать на DECIMALвместо этого. См. Например, stackoverflow.com/questions/7368163/… .
markusk
7

Похоже, этот трюк работает в SQL Server и короче (на основе предыдущих ответов)

SELECT 1.0*MyInt1/MyInt2

Или:

SELECT (1.0*MyInt1)/MyInt2
Troglo
источник
2
Мне это больше всего понравилось, оно даже выглядит хорошо для процентных расчетов:SELECT 100.0 * @Elapsed / @Total
EliSherer
3

Использовать это

select cast((1*1.00)/3 AS DECIMAL(16,2)) as Result

Здесь, в этом sql, сначала нужно преобразовать в число с плавающей точкой или умножить на 1.00. Какой результат будет числом с плавающей точкой. Здесь я рассмотрю 2 десятичных знака. Вы можете выбрать то, что вам нужно.

nazmul.3026
источник
2

Если вы пришли сюда (как и я), чтобы найти решение для целочисленного значения , вот ответ:

CAST(9/2 AS UNSIGNED)

возвращает 5

троянский
источник