단일 SELECT 문에서 여러 범위에 대한 반환 횟수


9

Postgres 데이터베이스 테이블 foo이 있는데 그 중에서도 0-10 score범위 의 열 이 있습니다. 쿼리가 총 점수 수, 0과 3 사이의 점수 수, 4 사이의 점수 수를 반환하도록 쿼리를 원합니다. 6과 7-10 사이의 점수 수입니다. 다음과 같은 것입니다.

SELECT
  COUNT(*) as total,
  COUNT(
    SELECT * from foo where score between 0 and 3;
  ) as low,
  COUNT(
    SELECT * from foo where score between 4 and 6;
  ) as mid,
  COUNT(
    SELECT * from foo where score between 7 and 10;
  ) as high
FROM foo;

나는 이것을 시도했지만 문 SELECT에서 오류가 발생했습니다 COUNT. 내가 어떻게 할 수있는 아이디어가 있습니까? Postgres에는 매우 간단한 방법이 있다고 확신합니다. Google에 대한 올바른 용어를 파악할 수 없습니다.

답변:


7

SUM()각 숫자 범위에 대해 열당 조건문을 사용하십시오 . SUM(1)표의 모든 데이터가 범위 중 하나에 속한다고 가정하면을 사용하여 합계를 합할 수 있습니다. 그렇지 않은 경우 다른 데이터와 마찬가지로 제한하십시오.

select sum(case when score between 0 and 3 then 1 else 0 end) as minrange,
       sum(case when score between 4 and 6 then 1 else 0 end) as midrange,
       sum(case when score between 7 and 10 then 1 else 0 end) as maxrange,
       sum(1) as total
from foo;

SQL 바이올린 링크 .


8

FILTERPostgres 9.4+의 집계 조항

Postgres 9.4부터 깨끗하고 빠른 (SQL 표준) 방법이 있습니다.

SELECT count(*) FILTER (WHERE score BETWEEN 0 AND 3)  AS low
     , count(*) FILTER (WHERE score BETWEEN 4 AND 7)  AS mid
     , count(*) FILTER (WHERE score BETWEEN 8 AND 10) AS high
     , count(*)                                       AS total
FROM   foo;

totalNULL 또는 다른 값이 포함되지 않는 한 low, mid및을 더합니다 high.

연결:

또한 아래를 읽으십시오.

Postgres 9.3-

몇 가지 기술이 있습니다.

@Phil 은 표준 방법으로 CASE진술을 제공했습니다 (표준 방법 sum(1)이 아닌 제외 ). 더 짧은 형식을 사용하고 싶습니다.

SELECT count(score BETWEEN 0 AND 3  OR NULL) AS low
     , count(score BETWEEN 4 AND 6  OR NULL) AS mid
     , count(score BETWEEN 7 AND 10 OR NULL) AS high
     , count(*)                              AS total
FROM   foo;

귀하의 가치가 귀하의 질문에 정의 된 바와 같으면 (단지 0- 10가능), 더 단순화하십시오 :

SELECT count(score < 4 OR NULL)             AS low
     , count(score BETWEEN 4 AND 6 OR NULL) AS mid
     , count(score > 6 OR NULL)             AS high
     , count(*)                             AS total
FROM   foo;

조금 짧고 간신히 빠릅니다.

미묘한 차이

있다 미묘한 차이 비교 sum()에서 필의 대답은 :

  • 가장 중요한 것은 문서 당 :

    를 제외하고 count이러한 함수는 행을 선택하지 않으면 null 값을 반환합니다. 특히, sum행이 없으면 null을 반환하지만 0이 아닌 예상대로 ...

  • count(*) 표준 방식과 조금보다 더 빨리 sum(1). 다시 null 대 0이 적용됩니다.

이러한 쿼리 (Phil 포함)는의 null 값을 계산합니다 total. 바람직하지 않은 경우 대신 사용하십시오.

count(score) AS total_not_null

9.3 페이지의 SQL Fiddle 10 페이지에서
db <> fiddle을 여기 에 표시 하십시오 .

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