2012-02-23 11 views
14

ho questo Query:Converti INT a galleggiare in 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 

Risultato:

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

Come vedi il "total" non è corretto per Denmark perché sum(sl.parts)=2 Moltiplica con 0.01 il totale dovrebbe essere 0.02 .

Il campo di prezzo è FLOAT in che modo è possibile eseguire il cast del totale per il float?

saluti,

risposta

19

in Oracle db c'è un trucco per la fusione int a stare a galla (suppongo, dovrebbe funzionare anche in mysql):

select myintfield + 0.0 as myfloatfield from mytable 
+0

Grazie heximal, Successo, vedere cambiamenti al post originale – alkhader

+1

non dimenticare la priorità operazioni aritmetiche, somma ha priorità inferiore rispetto moltiplicazione . (sum (sl.parts) +0.0) * cp.price sarebbe più corretto. – heximal

+0

Sì, ho bisogno che la SUM avvenga prima della moltiplicazione – alkhader

28

Mentre @ opere risposta di Heximal, I don' lo consiglio personalmente

Questo perché utilizza il numero di fusione. Sebbene non sia stato immesso CAST, è necessario eseguire il cast dello o dello 0.0 per gli stessi tipi di dati, prima che sia possibile eseguire +. In questo caso l'ordine di precedenza è a tuo favore, e ottieni un float su entrambi i lati e un float come risultato di +. Ma SUM(aFloatField) + 0 non produce un INT, perché 0 è implicitamente trasmesso a un FLOAT.

Trovo che nella maggior parte dei casi di programmazione, è preferibile lo esplicito. Non lasciare le cose al caso, alla confusione o all'interpretazione.

Se si desidera essere espliciti, vorrei utilizzare quanto segue.

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


Non voglio discutere se numerico o galleggiante (punto fisso, invece di virgola mobile) è più appropriato, quando si tratta di errori rouding, ecc mi limiterò a farvi Google che se ne hai bisogno, ma FLOAT è così pesantemente usato che c'è ancora molto da leggere sull'argomento.

È possibile provare il seguente per vedere cosa succede ...

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

Grazie Dems, quando ho provato CAST (SUM (sl.parts) AS NUMERIC (10,4)) * CAST (cp.price AS NUMERIC (10,4)), fornisce una sintassi corretta per l'errore di sintassi da utilizzare vicino a 'FLOAT) – alkhader

+0

@alkhader: lo snippet non include la parola "FLOAT", quindi è necessario mostrare il resto della query. Potrebbe essere semplicemente un ')' o ',' da un'istruzione precedente. – MatBailie

+0

Grazie a Dems, ho aggiornato il mio POST originale con la query che ho usato. – alkhader