나는 테이블이있다
create table us
(
a number
);
이제 다음과 같은 데이터가 있습니다.
a
1
2
3
4
null
null
null
8
9
지금은 널 (null) 카운트 단일 쿼리가 필요 하고 열 A하지 null 값을
union여기 를 사용 하시겠습니까? Montecristo의 대답은 지금까지 최고의 솔루션입니다.
나는 테이블이있다
create table us
(
a number
);
이제 다음과 같은 데이터가 있습니다.
a
1
2
3
4
null
null
null
8
9
지금은 널 (null) 카운트 단일 쿼리가 필요 하고 열 A하지 null 값을
union여기 를 사용 하시겠습니까? Montecristo의 대답은 지금까지 최고의 솔루션입니다.
답변:
이것은 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;
count(*)하고 count(a)또한 잘 작동group by
COUNT(a)합니다. 추가 할 유용한 주석이지만 스택에 따라 경고 / 오류가 발생하고 코드에 주석이 필요할 수 있습니다. SUM방법 을 선호합니다 .
count(*)에count(1)
올바르게 이해하면 열에서 모든 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;
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
"Null values"하면됩니다 'Null values'. 작은 따옴표는 두 배가 아닙니다.
널이 아닌 경우
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 count(*) from t where a is null)이 있는 곳에서 특히 그렇습니다 .
또 다른 대안을 제공하기 위해 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
조금 까다 롭습니다. 테이블에 열이 하나만 있다고 가정하면 Count (1) 및 Count (*)는 다른 값을 제공합니다.
set nocount on
declare @table1 table (empid int)
insert @table1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(NULL),(11),(12),(NULL),(13),(14);
select * from @table1
select COUNT(1) as "COUNT(1)" from @table1
select COUNT(empid) "Count(empid)" from @table1
이미지에서 볼 수 있듯이 첫 번째 결과는 테이블에 16 개의 행이 있음을 보여줍니다. 다음 중 두 행이 NULL입니다. 따라서 Count (*)를 사용할 때 쿼리 엔진은 행 수를 계산하므로 결과는 16으로 계산됩니다. 그러나 Count (empid)의 경우 empid 열에서 NULL이 아닌 값을 계산했습니다 . 결과는 14입니다.
따라서 COUNT (Column)를 사용할 때마다 아래와 같이 NULL 값을 처리해야합니다.
select COUNT(isnull(empid,1)) from @table1
NULL 값과 NULL이 아닌 값을 모두 계산합니다.
참고 : 테이블이 둘 이상의 열로 구성된 경우에도 동일한 사항이 적용됩니다. Count (1)은 NULL / Non-NULL 값에 관계없이 총 행 수를 제공합니다. Count (Column)를 사용하여 열 값을 계산할 때만 NULL 값을 처리해야합니다.
비슷한 문제가 있습니다. 모든 고유 값을 계산하고 null 값도 1로 계산합니다. 이 경우 널 (null) 값을 고려하지 않으므로 단순 개수는 작동하지 않습니다.
다음은 SQL에서 작동하며 새 값을 선택하지 않는 스 니펫입니다. 기본적으로 고유를 수행 한 후에는 row_number () 함수를 사용하여 새 열 (n)의 행 번호를 반환 한 다음 해당 열에서 카운트를 수행하십시오.
SELECT COUNT(n)
FROM (
SELECT *, row_number() OVER (ORDER BY [MyColumn] ASC) n
FROM (
SELECT DISTINCT [MyColumn]
FROM [MyTable]
) items
) distinctItems
mysql이라면 이와 같은 것을 시도해 볼 수 있습니다.
select
(select count(*) from TABLENAME WHERE a = 'null') as total_null,
(select count(*) from TABLENAME WHERE a != 'null') as total_not_null
FROM TABLENAME
이것은 T-SQL에서 작동합니다. 무언가의 수를 세고 널을 포함하려면 대소 문자 대신 COALESCE를 사용하십시오.
IF OBJECT_ID('tempdb..#us') IS NOT NULL
DROP TABLE #us
CREATE TABLE #us
(
a INT NULL
);
INSERT INTO #us VALUES (1),(2),(3),(4),(NULL),(NULL),(NULL),(8),(9)
SELECT * FROM #us
SELECT CASE WHEN a IS NULL THEN 'NULL' ELSE 'NON-NULL' END AS 'NULL?',
COUNT(CASE WHEN a IS NULL THEN 'NULL' ELSE 'NON-NULL' END) AS 'Count'
FROM #us
GROUP BY CASE WHEN a IS NULL THEN 'NULL' ELSE 'NON-NULL' END
SELECT COALESCE(CAST(a AS NVARCHAR),'NULL') AS a,
COUNT(COALESCE(CAST(a AS NVARCHAR),'NULL')) AS 'Count'
FROM #us
GROUP BY COALESCE(CAST(a AS NVARCHAR),'NULL')
Alberto를 기반으로 롤업을 추가했습니다.
SELECT [Narrative] = CASE
WHEN [Narrative] IS NULL THEN 'count_total' ELSE [Narrative] END
,[Count]=SUM([Count]) FROM (SELECT COUNT(*) [Count], 'count_nulls' AS [Narrative]
FROM [CrmDW].[CRM].[User]
WHERE [EmployeeID] IS NULL
UNION
SELECT COUNT(*), 'count_not_nulls ' AS narrative
FROM [CrmDW].[CRM].[User]
WHERE [EmployeeID] IS NOT NULL) S
GROUP BY [Narrative] WITH CUBE;
SELECT
ALL_VALUES
,COUNT(ALL_VALUES)
FROM(
SELECT
NVL2(A,'NOT NULL','NULL') AS ALL_VALUES
,NVL(A,0)
FROM US
)
GROUP BY ALL_VALUES
select count(isnull(NullableColumn,-1))
널이 아닌 값을 세는 것
select count(*) from us where a is not null;
널값 계산
select count(*) from us where a is null;
postgres 10에서 테이블을 만들었고 다음 두 가지 모두 작동했습니다.
select count(*) from us
과
select count(a is null) from us
a IS NULL생산 TRUE또는 FALSE, 및 COUNT () 모든 NOT NULL 값을 계산합니다. 따라서 count(a is null)모든 행의 개수를 반환합니다.
필자의 경우 여러 열 사이에 " null 분포 "를 원했습니다 .
SELECT
(CASE WHEN a IS NULL THEN 'NULL' ELSE 'NOT-NULL' END) AS a_null,
(CASE WHEN b IS NULL THEN 'NULL' ELSE 'NOT-NULL' END) AS b_null,
(CASE WHEN c IS NULL THEN 'NULL' ELSE 'NOT-NULL' END) AS c_null,
...
count(*)
FROM us
GROUP BY 1, 2, 3,...
ORDER BY 1, 2, 3,...
'...'에 따라 필요한만큼 많은 열로 쉽게 확장 할 수 있습니다.