Как получить точную сумму - PullRequest
3 голосов
/ 25 февраля 2012

Запрос

Select 9/5 'Отображение вывода как 1

Я хочу получить точный вывод за 9/5

Ожидаемый выход

1.8 instead of 1

Как сделать запрос

Ответы [ 2 ]

5 голосов
/ 25 февраля 2012

Проблема в том, что он выполняет целочисленную математику. Вы можете явно обращаться с ними как с десятичными числами, добавив .0:

SELECT 9.0 / 5.0

Вы также можете использовать CONVERT или CAST, чтобы быть еще более явным:

SELECT CONVERT(DECIMAL(9,4), 9) / CONVERT(DECIMAL(9,4), 5)

Примечание. Если любой из операндов представляет собой десятичное число, результатом будет десятичное число, поэтому технически необходимо преобразовать только один из них. Так что любой из них также будет работать:

SELECT 9 / 5.0
SELECT 9.0 / 5
SELECT CONVERT(DECIMAL(9,4), 9) / 5
SELECT 9 / CONVERT(DECIMAL(9,4), 5)

Причина, по которой он работает, заключается в том, что стандарт ANSI / ISO-SQL фактически говорит, что результаты математических операций должны быть того же типа данных, что и один из операндов. Поэтому, если оба операнда являются целыми числами, результат в соответствии со стандартом ANSI / ISO-SQL также должен быть целым числом.

MySQL здесь нарушает стандарт (предположительно в интересах практичности), но MS SQL соответствует ему.

0 голосов
/ 25 февраля 2012

У меня нет доступа к sql-серверу, и, похоже, mysql дает правильный ответ. Тем не менее, я бы попытался заставить один или оба аргумента быть плавающими (т.е. SELECT 9.0 /5.0)

...