Конвертировать INT в FLOAT в SQL - PullRequest
22 голосов
/ 23 февраля 2012

У меня есть этот запрос:

   SELECT sl.sms_prefix, sum( sl.parts ) , cp.country_name, CAST(SUM(sl.parts) AS NUMERIC(10,4)) * CAST(cp.price AS NUMERIC(10,4))
FROM sms_log sl, sms_transaction st, country_prefix cp
WHERE st.customer_id =1
AND st.sendtime >=1329865200
AND st.sendtime <=1330037999
AND st.sms_trans_id = sl.trans_id
AND sl.sms_prefix = cp.prefix
AND st.customer_id = cp.customer_id
GROUP BY sl.sms_prefix
LIMIT 0 , 30

Результат:

sms_prefix  sum( sl.parts )     country_name    price   total
==================================================================================
45            2                        Denmark   0.01   0.019999999552965
63            3                        Philippines   2  6

Как видите, "total" не подходит для Denmark, потому что sum( sl.parts )=2 умножить на 0.01 общая сумма должна составлять 0.02.

Поле цены равно FLOAT как я могу КАСТИТЬ общую сумму, чтобы плавать?

С уважением,

Ответы [ 2 ]

32 голосов
/ 23 февраля 2012

Хотя ответ @ Heximal работает, я лично не рекомендую его.

Это потому, что он использует неявное приведение.Хотя вы не набрали CAST, либо SUM(), либо 0.0 необходимо привести к тем же типам данных, прежде чем + может произойти.В этом случае порядок старшинства в вашу пользу, и вы получаете плавающее число с обеих сторон и плавающее число в результате +.Но SUM(aFloatField) + 0 не дает INT, потому что 0 подразумевается неявно приведение к FLOAT.

Я считаю, что в большинстве случаев программирования гораздо предпочтительнее быть явно .Не оставляйте вещи на волю случая, путаницы или толкования.

Если вы хотите быть явным, я бы использовал следующее.

CAST(SUM(sl.parts) AS FLOAT) * cp.price

Я не буду обсуждать, является ли NUMERIC или FLOAT (фиксированная точка вместо плавающей запятой) более подходящим, когда речь идет об ошибках маршрутизации и т. Д. Я просто позволю вам Google, если вам нужно,но FLOAT настолько широко используется неправильно, что о нем уже есть что почитать.

Вы можете попробовать следующее, чтобы увидеть, что происходит ...

CAST(SUM(sl.parts) AS NUMERIC(10,4)) * CAST(cp.price AS NUMERIC(10,4))
30 голосов
/ 23 февраля 2012

В oracle db есть хитрость для приведения int к float (я полагаю, это также должно работать в mysql):

select myintfield + 0.0 as myfloatfield from mytable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...