2012-02-23 13 views
14

में फ्लोट करने के लिए मैं इस क्वेरी है:Convert INT एसक्यूएल

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 के लिए क्योंकि 0.01 साथ sum(sl.parts)=2 गुणा कुल 0.02 होना चाहिए ।

मूल्य फ़ील्ड FLOAT मैं कुल फ्लोट करने के लिए कैसे सीएएसटी कर सकता हूं?

सादर,

उत्तर

19

ओरेकल DB में कास्टिंग पूर्णांक फ्लोट करने के लिए एक चाल (मुझे लगता है, यह भी mysql में काम करना चाहिए) है:

select myintfield + 0.0 as myfloatfield from mytable 
+0

धन्यवाद heximal, सफलता, कृपया मूल पोस्ट – alkhader

+1

में परिवर्तन देखने अंकगणितीय आपरेशनों प्राथमिकता के बारे में भूल नहीं है, योग गुणन की तुलना में कम प्राथमिकता है । (योग (sl.parts) +0.0) * cp.price अधिक सही होगा। – heximal

+0

हां, मुझे गुणा – alkhader

28

जबकि @ Heximal का जवाब काम करता है, मैं ' व्यक्तिगत रूप से इसकी अनुशंसा नहीं करते हैं।

ऐसा इसलिए है क्योंकि यह imlicit कास्टिंग का उपयोग करता है। यद्यपि आपने से पहले CAST टाइप नहीं किया था, या तो SUM() या 0.0 को समान डेटा-प्रकार होने के लिए डालने की आवश्यकता है। इस मामले में प्राथमिकता का क्रम आपके पक्ष में है, और आपको + के परिणामस्वरूप दोनों तरफ एक फ्लोट मिलता है, और एक फ्लोट मिलता है। लेकिन SUM(aFloatField) + 0 एक आईएनटी उत्पन्न नहीं करता है, क्योंकि 0प्रतीत होता है एक फ्लोट पर डाला गया है।

मुझे लगता है कि अधिकांश प्रोग्रामिंग मामलों में, स्पष्ट होना बहुत बेहतर है। चीजों को मौका, भ्रम, या व्याख्या में मत छोड़ो।

यदि आप स्पष्ट होना चाहते हैं, तो मैं निम्नलिखित का उपयोग करूंगा।

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


मैं चाहे NUMERIC चर्चा करेंगे नहीं या (फिक्स्ड बिंदु, चल बिन्दु के बजाय) नाव अधिक उपयुक्त है, जब यह rouding त्रुटियों की बात आती है, आदि मैं सिर्फ आपको लगता है कि गूगल दूँगा यदि आपको आवश्यकता है, लेकिन फ्लोट इतनी व्यापक रूप से गलत उपयोग किया जाता है कि पहले से मौजूद विषय के बारे में बहुत कुछ पढ़ना है।

तुम देखो क्या होता है निम्नलिखित की कोशिश कर सकते हैं ...

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

धन्यवाद डैम्स, जब मैंने CAST (SUM (sl.parts) AS NUMERIC (10,4)) * CAST (cp.price AS NUMERIC (10,4)) की कोशिश की, तो यह 'फ्लोट' के पास उपयोग करने के लिए सिंटैक्स त्रुटि सही वाक्यविन्यास देता है) – alkhader

+0

@alkhader - आपके स्निपेट में 'फ़्लोट' शब्द शामिल नहीं है - इसलिए आपको अपनी शेष क्वेरी को दिखाने की आवश्यकता है। यह पहले के कथन से सिर्फ ') 'या', 'गायब हो सकता है। – MatBailie

+0

धन्यवाद डैम्स, मैंने अपनी मूल पोस्ट को मेरे द्वारा उपयोग की जाने वाली क्वेरी के साथ अपडेट किया है। – alkhader

संबंधित मुद्दे