[sql] postgresql-sql-`true` 값 개수
myCol
------
true
true
true
false
false
null
위의 표에서 다음을 수행하면
select count(*), count(myCol);
나는 얻다 6, 5
5
null 항목을 계산하지 않기 때문에 얻 습니다.
참 값의 수도 계산하는 방법 (예제에서 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;