count ()를 사용하여 백분율을 결정한 PostgreSQL (캐스트 문제)


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 자리로 반올림되는 방법을 보여줄 수 있습니까?

여러 count 문 보다이 코드를 작성하는 더 좋은 방법이 있다고 확신합니다. 특히이 쿼리를 작성하는보다 프로세서 효율적인 방법을 찾고 있습니다.


답변 이 도움 이 될 수 있습니다.
존 앤더슨 카르데나스 디아즈

답변:


26
SELECT (count(refinst) * 100)::numeric / count(*) AS refinst_percentage
FROM   patients;
  • 마십시오 하지 하위 선택을 사용합니다. 두 집계 모두 동일한 쿼리에서 파생 될 수 있습니다. 더 싸다.

  • 또한,이입니다 하지 당신이 행 당 하나 개의 결과를 하나의 결과를 계산하려면, 그리고 이후, 윈도우 함수의 경우.

  • @a_horse 와 같이 소수를 지원 하는 모든 숫자 유형으로 캐스트하십시오 . 두 개의 소수 자릿수 를 원하기 때문에 Postgres 와 동일 합니다. 그러나 계산에 관련된 하나의 값, 바람직하게는 첫 번째 값 을 캐스팅하는 것으로 충분합니다 . Postgres는 정보를 잃지 않는 유형에 대해 자동으로 정산합니다.
    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을 곱하면 결과가 정수가 아닌 float로 자동 캐스팅됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.