我有这个查询:
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"
的{{1}}不正确,因为Denmark
与sum( sl.parts )=2
相乘,总数应为0.01
。
价格字段是0.02
我怎样才能使总数浮动?
此致
答案 0 :(得分:32)
虽然@Hiximal的答案有效,但我个人并不推荐。
这是因为它使用 imlicit 强制转换。虽然您没有键入CAST
,但在SUM()
发生之前,0.0
或+
需要转换为相同的数据类型。在这种情况下,优先顺序对您有利,并且您在两侧都有一个浮点数,并且+
会得到一个浮点数。但SUM(aFloatField) + 0
不会产生INT,因为0
暗示强制转换为FLOAT。
我发现在大多数编程案例中,最好是显式。不要把事情置于机会,混乱或解释之中。
如果你想明确,我会使用以下内容。
CAST(SUM(sl.parts) AS FLOAT) * cp.price
我不会讨论NUMERIC或FLOAT (固定点,而不是浮点)是否更合适,当涉及到编辑错误等时。我只会让你谷歌,如果你需要但是,FLOAT被大量滥用,以至于有很多关于已经存在的主题的内容。
您可以尝试以下操作来查看会发生什么......
CAST(SUM(sl.parts) AS NUMERIC(10,4)) * CAST(cp.price AS NUMERIC(10,4))
答案 1 :(得分:27)
在oracle db中有一个把int转换为float的技巧(我想,它也适用于mysql):
select myintfield + 0.0 as myfloatfield from mytable