2012-06-19 9 views
14

लौटने में मेरी एक प्रश्न में ऐसा लगता है कि AVG फ़ंक्शन एक int वापस कर रहा है।एसक्यूएल एवीजी एक int

select ..., AVG(e.employee_level)avg_level 

मैं इसे कैसे चल बिन्दु मान वापस जाने के लिए मिलता है? मैंने इसे कास्ट करने का प्रयास किया लेकिन avg_level के लिए मेरी सभी पंक्तियां अभी भी पूर्णांक थीं।

+1

पूर्णांक पर AVG() फ़ंक्शन का व्यवहार एएनएसआई मानक में परिभाषित नहीं किया गया है। कुछ डेटाबेस एक पूर्णांक लौटाते हैं; अन्य डेटाबेस एक फ्लोट लौटते हैं। एक फ्लोट पाने के लिए आप एक स्पष्ट कास्ट/कन्वर्ट का उपयोग कर सकते हैं। या, मैं जो करता हूं वह बस 1.0 से गुणा करता है। –

उत्तर

26

इस तरह यह करने के लिए प्रयास करें:

AVG(Cast(e.employee_level as Float)) as avg_level 

इसके अलावा मैं this विषय जहाँ आप कुछ एक और दृष्टिकोण पा सकते हैं पाया, लेकिन मैं नहीं इसके लिए प्रयोग किया जाता है और वास्तव में काम करता है या नहीं, पता नहीं है।

+3

@CodeKingPlusPlus - मुझे लगता है कि आपने 'CAST (AVG (फ़ील्ड) AS फ़्लोट) की कोशिश की? 'एवीजी (फ़ील्ड) 'अभी भी वही उत्तर लौटाएगा, जो एक आईएनटी है, जिसके द्वारा इसे फ्लोट में डालने का समय आपकी मदद नहीं करेगा। 'एवीजी (सीएएसटी (फील्ड एएस फ्लोट)), हालांकि, बहुत अलग है, और शायद आप जो चाहते हैं। * [इस जवाब में + 1] * – MatBailie

+0

@ डेम्स हां, ठीक है, ऐसा लगता है लेकिन यह नहीं। – Sajmon

1

कास्टिंग अधिक निश्चित है, लेकिन ...AVG(1.0 * e.employee_level)... यह भी कर सकता है, और अधिक सुगम हो सकता है।

+3

यह आरडीबीएमएस पर निर्भर करता है। AFAIK कई आरडीबीएमएस '1.0' को निश्चित बिंदु NUMERIC मान के रूप में मानते हैं, फ्लोट नहीं। इसी तरह के प्रभाव, संभवतः इस मामले के लिए भी बेहतर है, लेकिन काफी समान नहीं है। इस कारण से मैं अपने कोड में स्पष्ट CAST/CONVERT पसंद करना चाहता हूं। फिर आप जानते हैं कि डेटा-प्रकार सटीकता और निहित रूपांतरणों पर निर्भर होने के बजाय, डेटा प्रकार किस प्रकार हैं। – MatBailie

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