[sql] postgresql-sql-`true` 값 개수

myCol
------
 true
 true
 true
 false
 false
 null

위의 표에서 다음을 수행하면

select count(*), count(myCol);

나는 얻다 6, 5

5null 항목을 계산하지 않기 때문에 얻 습니다.

참 값의 수도 계산하는 방법 (예제에서 3)

(이것은 단순화이며 실제로 count 함수 내에서 훨씬 더 복잡한 표현식을 사용하고 있습니다)

요약 편집 : 쿼리에 일반 개수 (*)도 포함하고 싶으므로 where 절을 사용할 수 없습니다.



답변

SELECT COALESCE(sum(CASE WHEN myCol THEN 1 ELSE 0 END),0) FROM <table name>

또는 스스로 알아 낸대로 :

SELECT count(CASE WHEN myCol THEN 1 END) FROM <table name>


답변

부울을 정수와 합계로 캐스팅합니다.

SELECT count(*),sum(myCol::int);

당신은 6,3.


답변

PostgreSQL 9.4부터는 참 값을 계산하는 매우 간결한 쿼리를 허용 하는 FILTER절이 있습니다.

select count(*) filter (where myCol)
from tbl;

위의 쿼리는 간단한 WHERE 절로 충분하다는 점에서 나쁜 예이며 구문을 보여주기위한 것입니다. FILTER 절이 빛나는 곳은 다른 집계와 결합하기 쉽다는 것입니다.

select count(*), -- all
       count(myCol), -- non null
       count(*) filter (where myCol) -- true
from tbl;

이 절은 다른 열을 조건 자로 사용하는 열의 집계에 특히 유용하며 단일 쿼리에서 다르게 필터링 된 집계를 가져올 수 있습니다.

select count(*),
       sum(otherCol) filter (where myCol)
from tbl;


답변

아마도 가장 좋은 방법은 nullif 함수를 사용하는 것입니다.

일반적으로

select
    count(nullif(myCol = false, true)),  -- count true values
    count(nullif(myCol = true, true)),   -- count false values
    count(myCol);

또는 간단히

select
    count(nullif(myCol, true)),  -- count false values
    count(nullif(myCol, false)), -- count true values
    count(myCol);

http://www.postgresql.org/docs/9.0/static/functions-conditional.html


답변

가장 짧고 게으른 (캐스팅없이) 솔루션은 다음 공식을 사용하는 것입니다.

SELECT COUNT(myCol OR NULL) FROM myTable;

직접 시도해보십시오.

SELECT COUNT(x < 7 OR NULL)
   FROM GENERATE_SERIES(0,10) t(x);

다음과 같은 결과를 제공합니다.

SELECT SUM(CASE WHEN x < 7 THEN 1 ELSE 0 END)
   FROM GENERATE_SERIES(0,10) t(x);


답변

MySQL에서도 다음과 같이 할 수 있습니다.

SELECT count(*) AS total
     , sum(myCol) AS countTrue --yes, you can add TRUEs as TRUE=1 and FALSE=0 !!
FROM yourTable
;

Postgres에서는 이것이 작동한다고 생각합니다.

SELECT count(*) AS total
     , sum(myCol::int) AS countTrue --convert Boolean to Integer
FROM yourTable
;

이상 (::을 피하고 표준 SQL 구문을 사용) :

SELECT count(*) AS total
     , sum(CAST(myCol AS int)) AS countTrue --convert Boolean to Integer
FROM yourTable
;


답변

select f1,
       CASE WHEN f1 = 't' THEN COUNT(*)
            WHEN f1 = 'f' THEN COUNT(*)
            END AS counts,
       (SELECT COUNT(*) FROM mytable) AS total_counts
from mytable
group by f1

아니면 아마도

SELECT SUM(CASE WHEN f1 = 't' THEN 1 END) AS t,
       SUM(CASE WHEN f1 = 'f' THEN 1 END) AS f,
       SUM(CASE WHEN f1 NOT IN ('t','f') OR f1 IS NULL THEN 1 END) AS others,
       SUM(CASE WHEN f1 IS NOT NULL OR f1 IS NULL THEN 1 ELSE 0 END) AS total_count
FROM mytable;