प्रतिशत का निर्धारण करने के लिए पोस्टग्रेएसक्यूएल () का उपयोग कर (कास्ट मुद्दों)


19

मैं अपनी patientsतालिका में पंक्तियों का% प्रदान करने के लिए निम्नलिखित क्वेरी को चलाने का प्रयास कर रहा हूं जिसमें refinstस्तंभ का मान है । मुझे 0 का परिणाम मिलता रहता है।

select (count (refinst) / (select count(*) from patients) * 100) as "Formula" 
from patients;

तालिका में 15556 पंक्तियाँ हैं, और select count(refinst) from patientsमुझे बताती है कि उन 1446 refinstस्तंभों में एक मूल्य है । जो प्रतिक्रिया मुझे क्वेरी से प्राप्त होगी, वह 30.62 ( 1446/15556*100=30.62XXXXX, दो दशमलव तक की) होगी।

मुझे पूरा यकीन है कि यह कुछ डेटा परिणामों के प्रकार के साथ क्या करना है (पूर्णांक मैं मान रहा हूं)। यदि मैं एक पूर्णांक द्वारा पूर्णांक को विभाजित करता हूं और परिणाम 0 से कम है, तो इसे 0 से छोटा किया जाता है? यदि ऐसा है, तो क्या कोई मुझे यह दिखा सकता है कि 2 दशमलव स्थानों के साथ संख्याओं के परिणाम कैसे डाले जाएं ताकि परिणाम 2 दशमलव स्थानों पर भी हो जाए?

मुझे यकीन है कि कई कोड स्टेटमेंट की तुलना में इस कोड को लिखने का एक बेहतर तरीका है। मैं विशेष रूप से इस क्वेरी को लिखने के लिए अधिक प्रोसेसर-कुशल तरीके की तलाश कर रहा हूं।


शायद यह जवाब आपकी मदद कर सकता है।
झोन एंडरसन कर्डेनस डियाज़

जवाबों:


26
SELECT (count(refinst) * 100)::numeric / count(*) AS refinst_percentage
FROM   patients;
  • है एक subselect का उपयोग करें। दोनों समुच्चय एक ही क्वेरी से प्राप्त किए जा सकते हैं। सस्ता।

  • इसके अलावा, यह विंडो फ़ंक्शन के लिए एक मामला नहीं है, क्योंकि आप एकल परिणाम की गणना करना चाहते हैं, और प्रति पंक्ति एक परिणाम नहीं।

  • किसी भी संख्यात्मक प्रकार के लिए जो भिन्नात्मक अंकों का समर्थन करता है, जैसे @a_horse पहले से ही समझाया गया है
    चूँकि आप round()दो भिन्नात्मक अंक चाहते हैं, numericजो मैं सुझाता हूँ (जो decimalपोस्टग्रेज में भी ऐसा ही है )।
    लेकिन यह गणना में शामिल एक मूल्य को प्राथमिकता देने के लिए पर्याप्त है , अधिमानतः पहला। पोस्टग्रेट्स स्वचालित रूप से उस प्रकार के लिए व्यवस्थित हो जाता है जो जानकारी नहीं खोता है।

  • यह आम तौर पर आप को विभाजित करने से पहले गुणा करने के लिए एक अच्छा विचार है । यह आमतौर पर गोलाई त्रुटियों को कम करता है और सस्ता होता है।
    इस मामले में, पहले गुणा ( count(refinst) * 100) की गणना सस्ते और सटीक integerअंकगणित के साथ की जा सकती है । इसके बाद ही हम numericअगले भाग के लिए integer(जिसे हम अतिरिक्त रूप से नहीं डालते हैं) को विभाजित और विभाजित करते हैं

दो अंश अंकों के लिए गोल:

SELECT round((count(refinst) * 100)::numeric / count(*), 2) AS refinst_percentage
FROM   patients;

बेशक आप सही हैं, विंडो फ़ंक्शन की आवश्यकता नहीं है। लेकिन तब वास्तव में फर्क नहीं पड़ता (पठनीयता के अलावा)।
a_horse_with_no_name

3

आपको डिवीजन में शामिल प्रत्येक संख्या को एक प्रकार से डालना होगा जो दशमलव का समर्थन करता है:

select (count(refinst)::decimal / (select count(*) from patients)::decimal) * 100  as "Formula" 
from patients;

आप स्केलर सब-क्वेरी के बजाय विंडो फ़ंक्शन को आज़माना चाह सकते हैं। यह तेज हो सकता है:

select (count(refinst)::decimal / (count(*) over ())::decimal) * 100 as "Formula" 
from patients;

0

मुझे लगता है कि यह धागा कुछ साल पुराना है, लेकिन: 100.0 के बजाय 100.0 से गुणा करने का प्रयास करें, जो स्वचालित रूप से परिणाम को पूर्णांक के बजाय फ्लोट के रूप में डालना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.