শতাংশ নির্ধারণের জন্য গণনা () ব্যবহার করে পোস্টগ্রিজ এসকিউএল (কাস্ট সমস্যাগুলি)


19

আমি আমার patientsটেবিলের refinstকলামের একটি মান আছে এমন সারিগুলির% সরবরাহ করতে নীচের ক্যোয়ারীটি চালানোর চেষ্টা করছি । আমি 0 এর ফলাফল পেতে থাকি।

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

টেবিলটির 15556 সারি রয়েছে এবং select count(refinst) from patientsআমাকে বলে যে refinstকলামটিতে তাদের 1446 মান রয়েছে have আমি ক্যোয়ারী থেকে যে প্রতিক্রিয়া পেতে চাই তা হবে 30.62 ( 1446/15556*100=30.62XXXXX, যা দুটি দশমিকের মতো হবে)।

আমি নিশ্চিত যে এটির গণনা ফলাফলের ডেটা ধরণের (ইন্টিজারগুলি আমি ধরে নিচ্ছি) এর সাথে কিছু করার আছে pretty আমি যদি একটি পূর্ণসংখ্যা দ্বারা একটি পূর্ণসংখ্যা ভাগ করে এবং ফলাফল 0 এর কম হয় তবে এটি 0 টি সংশোধন করা হয়? যদি এটি হয় তবে কেউ আমাকে কীভাবে 2 দশমিক স্থানের সাথে একটি সংখ্যা হিসাবে গণনাগুলির ফলাফলগুলি ফেলে দিতে পারেন যাতে ফলাফলটিও 2 দশমিক স্থানে পরিণত হয়?

আমি নিশ্চিত যে একাধিক কাউন্ট স্টেটমেন্টের চেয়ে এই কোডটি লেখার আরও ভাল উপায় আছে। বিশেষত এই কোয়েরিটি লিখতে আমি আরও প্রসেসর-দক্ষ উপায়ের সন্ধান করছি।


হতে পারে এই উত্তর আপনাকে সাহায্য করতে পারে।
ঝন অ্যান্ডারসন কারডেনাস ডিয়াজ

উত্তর:


26
SELECT (count(refinst) * 100)::numeric / count(*) AS refinst_percentage
FROM   patients;
  • সাবলেট ব্যবহার করবেন না । উভয় সমষ্টি একই ক্যোয়ারী থেকে নেওয়া যেতে পারে। সস্তা.

  • এছাড়াও, উইন্ডো ফাংশনগুলির ক্ষেত্রে এটি কেস নয় , যেহেতু আপনি একক ফলাফলের গণনা করতে চান, এবং প্রতি সারিতে একটিও ফলাফল নয়।

  • @A_horse ইতিমধ্যে ব্যাখ্যা করা মত ভগ্নাংশের সংখ্যাগুলিকে সমর্থন করে এমন কোনও সংখ্যক প্রকারে কাস্ট করুন । যেহেতু আপনি দুটি প্রস্তাবিত অঙ্ক করতে চান আমি প্রস্তাব করছি (যা পোস্টগ্রিসের মতোই )। তবে এটি গণনার সাথে জড়িত একটি মান toালাই যথেষ্ট pre পোস্টগ্রাগেস স্বয়ংক্রিয়ভাবে সেই ধরণের জন্য স্থির হয় যা তথ্য হারায় না।
    round()numericdecimal

  • ভাগ করার আগে সাধারণত গুণ করা ভাল । এটি সাধারণত গোলাকার ত্রুটিগুলি হ্রাস করে এবং এটি সস্তা।
    এই ক্ষেত্রে, প্রথম গুণন ( 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 এর পরিবর্তে 100.0 দ্বারা গুণনের চেষ্টা করুন যা স্বয়ংক্রিয়ভাবে ফলাফলটিকে পূর্ণসংখ্যার পরিবর্তে ভাসমান হিসাবে ফেলে দেওয়া উচিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.