단일 쿼리에서 null 및 null이 아닌 값 계산
자리가 있습니다.
create table us
(
a number
);
이제 다음과 같은 데이터가 있습니다.
a
1
2
3
4
null
null
null
8
9
이제 열 a에서 null 값과 null 값이 아닌 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
무효가 아닌 경우에
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
제 시스템의 일부 테스트에서는 테이블 전체 스캔 비용이 듭니다.
당신의 질문을 이해했으므로 이 스크립트를 실행하면 Total Null, Total Not Null 행이 나옵니다.
select count(*) - count(a) as 'Null', count(a) as 'Not Null' 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+를 통해 Aggregate에 a를 적용할 수 있습니다.
SELECT
COUNT(*) FILTER (WHERE a IS NULL) count_nulls,
COUNT(*) FILTER (WHERE a IS NOT NULL) count_not_nulls
FROM us;
SQLFidle: http://sqlfiddle.com/ #!17/80a24/5
이건 좀 까다롭네요.표에 열이 하나만 있다고 가정하면 카운트(1)와 카운트(*)는 서로 다른 값을 제공합니다.
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입니다. 따라서 카운트(*)를 사용하면 쿼리 엔진이 행의 개수를 계산하므로 카운트 결과는 16이 됩니다.그러나 카운트(empid)의 경우에는 열 empid에서 non-NULL 값을 계산했습니다.결과는 14로 나왔습니다.
따라서 COUNT(Column)를 사용할 때마다 아래와 같이 NULL 값을 주의해야 합니다.
select COUNT(isnull(empid,1)) from @table1
NULL 값과 Non-NULL 값을 모두 카운트합니다.
참고: 테이블이 두 개 이상의 열로 구성된 경우에도 동일한 사항이 적용됩니다.카운트(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
이거 먹어봐요.
SELECT CASE
WHEN a IS NULL THEN 'Null'
ELSE 'Not Null'
END a,
Count(1)
FROM us
GROUP BY CASE
WHEN a IS NULL THEN 'Null'
ELSE 'Not Null'
END
ISUL 임베디드 함수를 사용합니다.
다음은 두 가지 해결책입니다.
Select count(columnname) as countofNotNulls, count(isnull(columnname,1))-count(columnname) AS Countofnulls from table name
오어
Select count(columnname) as countofNotNulls, count(*)-count(columnname) AS Countofnulls from table name
해라
SELECT
SUM(ISNULL(a)) AS all_null,
SUM(!ISNULL(a)) AS all_not_null
FROM us;
간단합니다!
MS Sql 서버를 사용하는 경우...
SELECT COUNT(0) AS 'Null_ColumnA_Records',
(
SELECT COUNT(0)
FROM your_table
WHERE ColumnA IS NOT NULL
) AS 'NOT_Null_ColumnA_Records'
FROM your_table
WHERE ColumnA IS NULL;
이런 짓은 안 하시겠어요그러나 여기 있습니다(결과적으로 동일한 표에 있음).
select count(isnull(NullableColumn,-1))
모든 답이 틀리거나 매우 시대에 뒤떨어졌습니다.
이 쿼리를 수행하는 간단하면서도 올바른 방법은 다음을 사용하는 것입니다.COUNT_IF
기능.
SELECT
COUNT_IF(a IS NULL) AS nulls,
COUNT_IF(a IS NOT NULL) AS not_nulls
FROM
us
SELECT SUM(NULLs) AS 'NULLS', SUM(NOTNULLs) AS 'NOTNULLs' FROM
(select count(*) AS 'NULLs', 0 as 'NOTNULLs' FROM us WHERE a is null
UNION select 0 as 'NULLs', count(*) AS 'NOTNULLs' FROM us WHERE a is not null) AS x
도망치긴 하지만 널 대 비 널의 카운트를 나타내는 2개의 콜이 있는 단일 레코드를 반환합니다.
이것은 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')
알베르토를 기반으로 롤업을 추가했습니다.
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
만약 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
한 장의 레코드로 원하는 경우를 대비해:
select
(select count(*) from tbl where colName is null) Nulls,
(select count(*) from tbl where colName is not null) NonNulls
;-)
null이 아닌 값을 계산하는 경우
select count(*) from us where a is not null;
null 값을 계산하는 경우
select count(*) from us where a is null;
포스트그레스 10에서 테이블을 만들었고 다음 두 가지 작업을 모두 수행했습니다.
select count(*) from us
그리고.
select count(a is null) from us
제 경우에는 여러 열 사이의 "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,...
'...'에 따르면 필요한 만큼 더 많은 열로 쉽게 확장할 수 있습니다.
a가 null인 요소 수:
select count(a) from us where a is null;
a가 null이 아닌 요소 수:
select count(a) from us where a is not null;
언급URL : https://stackoverflow.com/questions/1271810/counting-null-and-non-null-values-in-a-single-query
'programing' 카테고리의 다른 글
변경 시 선택한 값/텍스트 가져오기 (0) | 2023.10.29 |
---|---|
서로 다른 두 사용자 테이블 간에 워드프레스 사이트 공유 (0) | 2023.10.29 |
jQuery는 한 클래스를 다른 클래스로 대체합니다. (0) | 2023.10.29 |
마리아DB 갈레라 성단 (0) | 2023.10.29 |
Android Application 클래스를 확장하는 이유는 무엇입니까? (0) | 2023.10.29 |