2012-02-23 8 views
14

tengo esta consulta:Convertir INT para flotar en 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 

Resultado:

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

Como se ve el "total" no es correcta para Denmark porque sum(sl.parts)=2 Multiplicar con 0.01 el total debe ser 0.02 .

El campo de precio es FLOAT ¿cómo puedo CASTAR el total para flotar?

Saludos,

Respuesta

19

en dB Oracle Se tiene un truco para int fundición a flote (supongo, también debería funcionar en MySQL):

select myintfield + 0.0 as myfloatfield from mytable 
+0

Gracias heximal, Éxito, por favor ver los cambios en el post original – alkhader

+1

no se olvide de prioridad de las operaciones aritméticas, suma tiene menor prioridad que la multiplicación . (sum (sl.parts) +0.0) * cp.price sería más correcto. – heximal

+0

Sí, necesito que SUM suceda antes de la multiplicación – alkhader

28

Mientras @ obras respuesta de Heximal, I don' lo recomiendo personalmente

Esto es porque utiliza implícita de fundición. Aunque no escribió CAST, el SUM() o el 0.0 deben emitirse para que sean del mismo tipo de datos, antes de que + suceda. En este caso, el orden de precedencia está a su favor, y obtiene un flotador en ambos lados, y un flotante como resultado del +. Pero SUM(aFloatField) + 0 no produce una INT, porque el 0 está siendo implícitamente lanzado a un FLOTADOR.

Encuentro que en la mayoría de los casos de programación, es preferible ser explícito. No deje las cosas al azar, la confusión o la interpretación.

Si quiere ser explícito, usaría lo siguiente.

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


no voy a discutir si numérico o flotar (punto fijo, en lugar de coma flotante) es más apropiado, cuando se trata de errores de varas redondas, etc. Voy a dejar que Google que si es necesario, pero FLOAT se utiliza tan mal de manera masiva que hay mucho que leer sobre el tema que ya existe.

Puede intentar lo siguiente para ver qué pasa ...

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

Gracias Dems, cuando probé CAST (SUM (sl.parts) AS NUMERIC (10,4)) * CAST (cp.price AS NUMERIC (10,4)), proporciona una sintaxis de error de sintaxis para usar cerca de 'FLOAT) – alkhader

+0

@alkhader: su fragmento no incluye la palabra 'FLOTANTE', por lo que debe mostrar el resto de su consulta. Puede ser simplemente un ')' o ',' faltante de una declaración anterior. – MatBailie

+0

Gracias Dems, he actualizado mi POST original con la consulta que utilicé. – alkhader