পোস্টগ্রেএসকিউএল-তে গড়ে 2 দশমিক স্থানে কীভাবে গোল করবেন?


191

আমি রুবি রত্ন 'সিক্যুয়েল' এর মাধ্যমে পোস্টগ্রিজ এসকিউএল ব্যবহার করছি।

আমি দুটি দশমিক জায়গায় গোল করার চেষ্টা করছি।

আমার কোডটি এখানে:

SELECT ROUND(AVG(some_column),2)    
FROM table

আমি নিম্নলিখিত ত্রুটি পেয়েছি:

PG::Error: ERROR:  function round(double precision, integer) does 
not exist (Sequel::DatabaseError)

আমি নিম্নলিখিত কোডটি চালানোর সময় কোনও ত্রুটি পাই না:

SELECT ROUND(AVG(some_column))
FROM table

কেউ কি জানে যে আমি কী ভুল করছি?


3
আপনার ত্রুটি বার্তাটি আপনার প্রশ্নের কোডটির সাথে মেলে না।
মিউ খুব ছোট

সিনট্যাক্স ত্রুটিটি একদিকে ফেলে, ডিবিএ.এস.এ সম্পর্কিত এই ঘনিষ্ঠভাবে সম্পর্কিত প্রশ্ন পোস্টগ্রেএসকিউএল-এ ডাবল স্পষ্টতা সংখ্যার বৃত্তাকারে কিছুটা আলোকপাত করবে।
এরউইন ব্র্যান্ডসটেটার

@ মিস্টুশোর্ট, এটি নির্দেশ করার জন্য ধন্যবাদ। এটি 'গোল' বলতে হবে যেখানে এটি 'গড়' বলে। সম্পাদনা করা হয়েছে।
ব্যবহারকারী1626730

ফলাফল অনুসন্ধানের জন্য, আমি প্রম্পট থেকে আউটপুট হিসাবে এই ইঙ্গিতটি HINT: No function matches the given name and argument types. You might need to add explicit type casts.
পাই

উত্তর:


264

PostgreSQL সংজ্ঞা দেয় না round(double precision, integer)। কারণ @Mike Sherrill 'বিড়াল রিকল' মন্তব্যে ব্যাখ্যা, গোল করে একটি স্পষ্টতা লাগে সংস্করণ জন্য কেবল প্রাপ্তিসাধ্য numeric

regress=> SELECT round( float8 '3.1415927', 2 );
ERROR:  function round(double precision, integer) does not exist

regress=> \df *round*
                           List of functions
   Schema   |  Name  | Result data type | Argument data types |  Type  
------------+--------+------------------+---------------------+--------
 pg_catalog | dround | double precision | double precision    | normal
 pg_catalog | round  | double precision | double precision    | normal
 pg_catalog | round  | numeric          | numeric             | normal
 pg_catalog | round  | numeric          | numeric, integer    | normal
(4 rows)

regress=> SELECT round( CAST(float8 '3.1415927' as numeric), 2);
 round 
-------
  3.14
(1 row)

(উপরের অংশে, নোট করুন এটির float8জন্য একটি শর্টহ্যান্ড ওরফে double precisionYou আপনি দেখতে পাচ্ছেন পোস্টগ্র্রেএসকিউএল এটি আউটপুটে প্রসারিত করছে)।

numericএর দ্বি-যুক্তি ফর্মটি ব্যবহার করার জন্য আপনাকে অবশ্যই গোলটি করতে মানটি দিতে হবে round::numericশর্টহ্যান্ড কাস্টের জন্য কেবল যুক্ত করুন round(val::numeric,2)


আপনি যদি ব্যবহারকারীর কাছে প্রদর্শনের জন্য ফর্ম্যাট করছেন তবে ব্যবহার করবেন না round। ব্যবহার করুন to_char(দেখুন: ম্যানুয়ালটিতে ডেটা টাইপ ফর্ম্যাটিং ফাংশন ), যা আপনাকে একটি ফর্ম্যাট নির্দিষ্ট করতে দেয় এবং আপনাকে এমন textফল দেয় যা আপনার ক্লায়েন্টের ভাষা numericমূল্যবোধের সাথে যা কিছু অদ্ভুততা দ্বারা প্রভাবিত হয় না । উদাহরণ স্বরূপ:

regress=> SELECT to_char(float8 '3.1415927', 'FM999999999.00');
    to_char    
---------------
 3.14
(1 row)

to_charফর্ম্যাটিংয়ের অংশ হিসাবে আপনার জন্য সংখ্যাগুলি গোল করবে। FMউপসর্গ বলে to_charযে আপনার নেতৃস্থানীয় শূণ্যস্থান সঙ্গে কোনো প্যাডিং চাই না।


হুম। আমি যখন চেষ্টা করে ROUND(CAST(FLOAT8 '3.1415927' AS NUMERIC),2);দেখি, আমি '0.314E1' পেয়েছি। এবং আমার কোডটি ROUND(AVG(val),2)এখনও লেখা আছে যা এখনও আমার প্রশ্নে বর্ণিত ত্রুটি পেয়েছি।
ব্যবহারকারী1626730

আমি কেবল ROUND(CAST(FLOAT8 '3.1415927' AS NUMERIC),2);পিজিএডমিন এবং রুবির উপর দৌড়েছি। পিজএডমিনের সাথে আমি ৩.১৪ পেয়েছি, তবে রুবির সাথে (সে সিকুয়েল রত্ন ব্যবহার করে) আমি '0.314E1' পেয়েছি। আমি ভাবছি কেন এটি ...
ব্যবহারকারীর 62730

12
"কিছু অদ্ভুত কারণে রাউন্ডের সংস্করণ যা একটি যথার্থতা গ্রহণ করে কেবলমাত্র সংখ্যার জন্য উপলভ্য।" ভাসমান-পয়েন্ট নম্বর হ'ল "দরকারী অনুমান"। যদি আপনি কোডটি দুটি দশমিক স্থানে ভাসমান-বিন্দু সংখ্যার দিকে গোল করতে বলে, অন্য একটি ফ্লোটিং-পয়েন্ট নম্বরটি ফিরিয়ে দেন , এর কোনও গ্যারান্টি নেই যে "ডান" উত্তরের নিকটতম সন্নিকটে দশমিকের ডানদিকে কেবল দুটি অঙ্ক থাকবে। সংখ্যাগুলি কার্যকরভাবে পূর্ণতর পূর্ণসংখ্যা হয়; তাদের সমস্যা নেই।
মাইক শেরিল 'ক্যাট রিকল'

@ ক্যাটাকল গুড পয়েন্ট - এর একটি doubleসংস্করণে roundফিরতে হবে numericবা (উঘ) text, যাতে এটি numericযুক্তিও গ্রহণ করতে পারে ।
ক্রেগ রিঞ্জার

6
যারা তাদের মন্তব্যগুলি গুগল ক্যাটাল দ্বারা অনুসন্ধান করার চেষ্টা করছেন তাদের জন্য: এখন এটি মাইক শেরিল 'ক্যাট
রিক্যাল

88

কাস্টিংয়ের জন্য পুরানো বাক্য গঠন চেষ্টা করে দেখুন,

SELECT ROUND(AVG(some_column)::numeric,2)    
FROM table;

PostgreSQL এর যে কোনও সংস্করণ নিয়ে কাজ করে।

কিছু পোস্টগ্রিজ এসকিউএল ফাংশনে ওভারলোডের অভাব রয়েছে , কেন (???): আমি মনে করি "এটি একটি অভাব" (!), তবে @ ক্রেইগ্রিঞ্জার, @ কেটকল এবং পোস্টগ্রিসকিউএল দল "পিজির historicতিহাসিক যুক্তি" সম্পর্কে একমত।

পিএস: রাউন্ডিং সম্পর্কে আরেকটি বিষয় যথার্থতা , @ ইয়ানকেইনির উত্তরটি দেখুন


Ingালাই কৌশল হিসাবে ওভারলোডিং

আপনি এর সাথে রাউন্ড ফাংশনটি ওভারলোড করতে পারেন ,

 CREATE FUNCTION ROUND(float,int) RETURNS NUMERIC AS $$
    SELECT ROUND($1::numeric,$2);
 $$ language SQL IMMUTABLE;

এখন আপনার নির্দেশটি কার্যকর হবে, চেষ্টা করুন (ফাংশন তৈরির পরে)

 SELECT round(1/3.,4); -- 0.3333 numeric

তবে এটি একটি NUMERIC টাইপ দেয় ... প্রথম কমোম-ব্যবহারের ওভারলোড সংরক্ষণের জন্য, যখন কোনও টেক্সট প্যারামিটারটি দেওয়া হয় তখন আমরা একটি ফ্ল্যাট টাইপ ফিরিয়ে দিতে পারি,

 CREATE FUNCTION ROUND(float, text, int DEFAULT 0) 
 RETURNS FLOAT AS $$
    SELECT CASE WHEN $2='dec'
                THEN ROUND($1::numeric,$3)::float
                -- ... WHEN $2='hex' THEN ... WHEN $2='bin' THEN... complete!
                ELSE 'NaN'::float  -- like an error message 
            END;
 $$ language SQL IMMUTABLE;

চেষ্টা

 SELECT round(1/3.,'dec',4);   -- 0.3333 float!
 SELECT round(2.8+1/3.,'dec',1); -- 3.1 float!
 SELECT round(2.8+1/3.,'dec'::text); -- need to cast string? pg bug 

PS: \df roundওভারলোডিংয়ের পরে চেক করা, এমন কিছু দেখাবে,

স্কিমা | নাম | ফলাফল তথ্য প্রকার | আর্গুমেন্ট তথ্য প্রকার
------------ + + ------- + + ------------------ + + ---------- ------------------
 মাইচেমা | বৃত্তাকার | ডাবল নির্ভুলতা | ডাবল স্পষ্টতা, পাঠ্য, ইনট
 মাইচেমা | বৃত্তাকার | সংখ্যা | ডাবল স্পষ্টতা, int
 pg_catolog | বৃত্তাকার | ডাবল নির্ভুলতা | ডাবল স্পষ্টতা            
 pg_catolog | বৃত্তাকার | সংখ্যা | সাংখ্যিক   
 pg_catolog | বৃত্তাকার | সংখ্যা | সংখ্যাসূচক, int          

দ্য pg_catalogফাংশন ডিফল্ট বেশী দেখতে বিল্ড-ইন গণিত ফাংশন ম্যানুয়াল


38

এটি দিয়ে চেষ্টা করুন:

SELECT to_char (2/3::float, 'FM999999990.00');
-- RESULT: 0.67

বা সহজভাবে:

SELECT round (2/3::DECIMAL, 2)::TEXT
-- RESULT: 0.67

5
আমার এই প্রশ্নের উত্তরটির সাথে আমার এই উত্তরটি আরও সংক্ষিপ্ত এবং সংক্ষিপ্ত এগিয়ে চলেছে বলে মনে হয়। : ধনুক:
ক্রিস্টড

2
একই অবস্থা! খুব সংক্ষিপ্ত এবং দরকারী সমাধান।
আলেক্সি শাবরামভ

7

আপনি নীচের ফাংশন ব্যবহার করতে পারেন

 SELECT TRUNC(14.568,2);

ফলাফলটি প্রদর্শিত হবে:

14.56

আপনি নিজের পরিবর্তনশীলটিকে আকাঙ্ক্ষার ধরণেও ফেলে দিতে পারেন:

 SELECT TRUNC(YOUR_VAR::numeric,2)

3

ব্রায়ানের প্রতিক্রিয়া অনুসারে আপনি কোনও প্রশ্নের দশমিক দশকে সীমাবদ্ধ করতে এটি করতে পারেন। আমি কিমি / ঘন্টা থেকে মি / সেকেন্ডারে রূপান্তর করি এবং এটি ডাইগ্রাফগুলিতে প্রদর্শন করি তবে যখন আমি এটি ডাইগ্রাফগুলিতে করি তখন এটি অদ্ভুত বলে মনে হয়। পরিবর্তে ক্যোয়ারিতে গণনা করার সময় ঠিকঠাক দেখাচ্ছে। এটি পোস্টগ্র্যাস্কল 9.5.1 এ রয়েছে।

select date,(wind_speed/3.6)::numeric(7,1) from readings;


1

ত্রুটি: ফাংশন বৃত্তাকার (ডাবল নির্ভুলতা, পূর্ণসংখ্যা) বিদ্যমান নেই

সমাধান : আপনার castালাই টাইপ করা দরকার তবে এটি কাজ করবে

উদা: round(extract(second from job_end_time_t)::integer,0)


0

রাউন্ড (এসএমএম (পরিমাণ) :: সংখ্যাসূচক, 2) নির্বাচন করুন মোট লভেন্দ্রে FROM লেনদেন হিসাবে

দেয়: 200234.08

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