Ruby gem ‘sequel’을 통해 PostgreSQL을 사용하고 있습니다.
소수점 이하 두 자리로 반올림하려고합니다.
내 코드는 다음과 같습니다.
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
아무도 내가 뭘 잘못하고 있는지 알고 있습니까?
답변
PostgreSQL은 정의하지 않습니다 round(double precision, integer)
. 의견에서 @Mike Sherrill ‘Cat Recall’이 설명하는 이유 때문에 정밀도를 취하는 라운드 버전은에서만 사용할 수 있습니다 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 precision
. PostgreSQL이 출력에서이를 확장하고 있음을 알 수 있습니다.
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
는 선행 공백과 패딩을 싶지 않아.
답변
캐스팅에 대한 이전 구문을 사용해보십시오.
SELECT ROUND(AVG(some_column)::numeric,2)
FROM table;
PostgreSQL의 모든 버전에서 작동합니다.
일부 PostgreSQL 함수 에는 오버로드가 부족한 이유는 무엇입니까? 왜?
추신 : 반올림에 대한 또 다른 요점은 정확성 입니다. @ IanKenney ‘s answer 확인하십시오 .
캐스팅 전략으로서의 과부하
다음 과 같이 ROUND 기능을 과부하 시킬 수 있습니다 .
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 유형을 반환합니다. 첫 번째 commom-usage 과부하를 유지하기 위해 TEXT 매개 변수가 제공 될 때 FLOAT 유형을 반환 할 수 있습니다.
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
추신 : \df round
과부하 후 점검 하면 다음과 같이 표시됩니다.
스키마 | 이름 | 결과 데이터 유형 | 인수 데이터 유형 ------------ + ------- + ------------------ + ---------- ------------------ 미스 테마 | 라운드 | 배정도 | 배정도, 텍스트, int 미스 테마 | 라운드 | 숫자 | 배정도, int pg_catalog | 라운드 | 배정도 | 배정도 pg_catalog | 라운드 | 숫자 | 숫자 pg_catalog | 라운드 | 숫자 | 숫자, 정수
pg_catalog
기능은 기본 것들 볼 빌드 – 수학 함수의 매뉴얼 .
답변
이것으로 시도하십시오 :
SELECT to_char (2/3::float, 'FM999999990.00');
-- RESULT: 0.67
또는 간단히 :
SELECT round (2/3::DECIMAL, 2)::TEXT
-- RESULT: 0.67
답변
아래 기능을 사용할 수 있습니다
SELECT TRUNC(14.568,2);
결과는 다음과 같이 표시됩니다.
14.56
변수를 원하는 유형으로 캐스트 할 수도 있습니다.
SELECT TRUNC(YOUR_VAR::numeric,2)
답변
Bryan의 응답 에 따르면 쿼리에서 소수를 제한하기 위해이 작업을 수행 할 수 있습니다. km / h에서 m / s로 변환하여 dygraphs에 표시하지만 dygraph에서 수행했을 때 이상하게 보였습니다. 대신 쿼리에서 계산을 수행 할 때 잘 보입니다. 이것은 postgresql 9.5.1에 있습니다.
select date,(wind_speed/3.6)::numeric(7,1) from readings;
답변
열을 다음과 같은 숫자로 캐스트하십시오.
SELECT ROUND(cast(some_column as numeric),2) FROM table
답변
오류 : 함수 반올림 (배정 밀도, 정수)이 존재하지 않습니다
해결책 : 타입 캐스트를 추가해야 작동합니다.
전의: round(extract(second from job_end_time_t)::integer,0)