Преобразование INT в FLOAT в SQL

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

   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, как я могу CAST, чтобы общее число плавало?

Привет,

Ответ 1

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

select myintfield + 0.0 as myfloatfield from mytable

Ответ 2

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

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

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

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

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


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

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

CAST(SUM(sl.parts) AS NUMERIC(10,4)) * CAST(cp.price AS NUMERIC(10,4))