[sql] 단일 쿼리에서 null 및 null이 아닌 값 계산

나는 테이블이있다

create table us
(
 a number
);

이제 다음과 같은 데이터가 있습니다.

a
1
2
3
4
null
null
null
8
9

지금은 널 (null) 카운트 단일 쿼리가 필요 하고 열 A하지 null 값을



답변

이것은 Oracle 및 SQL Server에서 작동합니다 (다른 RDBMS에서 작동하도록 할 수 있음).

select sum(case when a is null then 1 else 0 end) count_nulls
     , count(a) count_not_nulls
  from us;

또는:

select count(*) - count(a), count(a) from us;


답변

올바르게 이해하면 열에서 모든 NULL과 NOT NULL을 모두 계산하려고합니다 …

그것이 맞다면 :

SELECT count(*) FROM us WHERE a IS NULL
UNION ALL
SELECT count(*) FROM us WHERE a IS NOT NULL

주석을 읽은 후 전체 쿼리를 갖도록 편집했습니다.]


SELECT COUNT(*), 'null_tally' AS narrative
  FROM us
 WHERE a IS NULL
UNION
SELECT COUNT(*), 'not_null_tally' AS narrative
  FROM us
 WHERE a IS NOT NULL;


답변

Oracle에서 작동하는 빠르고 더러운 버전은 다음과 같습니다.

select sum(case a when null then 1 else 0) "Null values",
       sum(case a when null then 0 else 1) "Non-null values"
from us


답변

쿼리를 이해 했으므로이 스크립트를 실행하고 Total Null, Total NotNull 행,

select count(*) - count(a) as 'Null', count(a) as 'Not Null' from us;


답변

널이 아닌 경우

select count(a)
from us

널용

select count(*)
from us

minus

select count(a)
from us

그 후

SELECT COUNT(A) NOT_NULLS
FROM US

UNION

SELECT COUNT(*) - COUNT(A) NULLS
FROM US

일을해야한다

열 제목이 올바르게 나옵니다.

SELECT COUNT(A) NOT_NULL, COUNT(*) - COUNT(A) NULLS
FROM US

내 시스템에 대한 일부 테스트에서는 전체 테이블 스캔 비용이 발생합니다.


답변

보통 나는이 트릭을 사용

select sum(case when a is null then 0 else 1 end) as count_notnull,
       sum(case when a is null then 1 else 0 end) as count_null
from tab
group by a


답변

또 다른 대안을 제공하기 위해 Postgres 9.4+ FILTER집합체에 a 를 적용 할 수 있습니다 .

SELECT
  COUNT(*) FILTER (WHERE a IS NULL) count_nulls,
  COUNT(*) FILTER (WHERE a IS NOT NULL) count_not_nulls
FROM us;

SQLFiddle : http://sqlfiddle.com/#!17/80a24/5