Counting null and non-null values in a single query

Sql

Sql Problem Overview


I have a table

create table us
(
 a number
);

Now I have data like:

a
1
2
3
4
null
null
null
8
9

Now I need a single query to count null and not null values in column a

Sql Solutions


Solution 1 - Sql

This works for Oracle and SQL Server (you might be able to get it to work on another RDBMS):

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

Or:

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

Solution 2 - Sql

If I understood correctly you want to count all NULL and all NOT NULL in a column...

If that is correct:

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

Edited to have the full query, after reading the comments :]


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;

Solution 3 - Sql

Here is a quick and dirty version that works on 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

Solution 4 - Sql

for non nulls

select count(a)
from us

for nulls

select count(*)
from us

minus 

select count(a)
from us

Hence

SELECT COUNT(A) NOT_NULLS
FROM US

UNION

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

ought to do the job

Better in that the column titles come out correct.

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

In some testing on my system, it costs a full table scan.

Solution 5 - Sql

As i understood your query, You just run this script and get Total Null,Total NotNull rows,

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

Solution 6 - Sql

usually i use this trick

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

Solution 7 - Sql

Just to provide yet another alternative, Postgres 9.4+ allows applying a FILTER to aggregates:

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

Solution 8 - Sql

This is little tricky. Assume the table has just one column, then the Count(1) and Count(*) will give different values.

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

Query Results

As you can see in the image, The first result shows the table has 16 rows. out of which two rows are NULL. So when we use Count(*) the query engine counts the number of rows, So we got count result as 16. But in case of Count(empid) it counted the non-NULL-values in the column empid. So we got the result as 14.

so whenever we are using COUNT(Column) make sure we take care of NULL values as shown below.

select COUNT(isnull(empid,1)) from @table1

will count both NULL and Non-NULL values.

Note: Same thing applies even when the table is made up of more than one column. Count(1) will give total number of rows irrespective of NULL/Non-NULL values. Only when the column values are counted using Count(Column) we need to take care of NULL values.

Solution 9 - Sql

I had a similar issue: to count all distinct values, counting null values as 1, too. A simple count doesn't work in this case, as it does not take null values into account.

Here's a snippet that works on SQL and does not involve selection of new values. Basically, once performed the distinct, also return the row number in a new column (n) using the row_number() function, then perform a count on that column:

SELECT COUNT(n)
FROM (
	SELECT *, row_number() OVER (ORDER BY [MyColumn] ASC) n
	FROM (
		SELECT DISTINCT [MyColumn]
					FROM [MyTable]
		) items  
) distinctItems
                             

Solution 10 - Sql

Here are two solutions:

Select count(columnname) as countofNotNulls, count(isnull(columnname,1))-count(columnname) AS Countofnulls from table name

OR

Select count(columnname) as countofNotNulls, count(*)-count(columnname) AS Countofnulls from table name

Solution 11 - Sql

Try

SELECT 
   SUM(ISNULL(a)) AS all_null,
   SUM(!ISNULL(a)) AS all_not_null
FROM us;

Simple!

Solution 12 - Sql

Try this..

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 

Solution 13 - Sql

If you're using MS Sql Server...

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;

I don't recomend you doing this... but here you have it (in the same table as result)

Solution 14 - Sql

use ISNULL embedded function.


Solution 15 - Sql

All the answers are either wrong or extremely out of date.

The simple and correct way of doing this query is using COUNT_IF function.

SELECT
  COUNT_IF(a IS NULL) AS nulls,
  COUNT_IF(a IS NOT NULL) AS not_nulls
FROM
  us

Solution 16 - Sql

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

It's fugly, but it will return a single record with 2 cols indicating the count of nulls vs non nulls.

Solution 17 - Sql

select count(isnull(NullableColumn,-1))

Solution 18 - Sql

This works in T-SQL. If you're just counting the number of something and you want to include the nulls, use COALESCE instead of case.

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')

Solution 19 - Sql

Building off of Alberto, I added the rollup.

 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;

Solution 20 - Sql

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

Solution 21 - Sql

if its mysql, you can try something like this.

select 
   (select count(*) from TABLENAME WHERE a = 'null') as total_null, 
   (select count(*) from TABLENAME WHERE a != 'null') as total_not_null
FROM TABLENAME

Solution 22 - Sql

Just in case you wanted it in a single record:

select 
  (select count(*) from tbl where colName is null) Nulls,
  (select count(*) from tbl where colName is not null) NonNulls 

;-)

Solution 23 - Sql

for counting not null values

select count(*) from us where a is not null;

for counting null values

 select count(*) from us where a is null;

Solution 24 - Sql

I created the table in postgres 10 and both of the following worked:

select count(*) from us

and

select count(a is null) from us

Solution 25 - Sql

In my case I wanted the "null distribution" amongst multiple columns:

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,...

As per the '...' it is easily extendable to more columns, as many as needed

Solution 26 - Sql

Number of elements where a is null:

select count(a) from us where a is null;

Number of elements where a is not null:

select count(a) from us where a is not null;

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionprabinView Question on Stackoverflow
Solution 1 - Sqluser155789View Answer on Stackoverflow
Solution 2 - SqlAlberto ZaccagniView Answer on Stackoverflow
Solution 3 - SqlchristophemlView Answer on Stackoverflow
Solution 4 - SqlEvilTeachView Answer on Stackoverflow
Solution 5 - SqlAriful HaqueView Answer on Stackoverflow
Solution 6 - Sqlelle0087View Answer on Stackoverflow
Solution 7 - SqlAbe VoelkerView Answer on Stackoverflow
Solution 8 - SqlSanthoshkumar LMView Answer on Stackoverflow
Solution 9 - SqlStarnuto di topoView Answer on Stackoverflow
Solution 10 - SqlAmal HariView Answer on Stackoverflow
Solution 11 - SqlRodrigo PrazimView Answer on Stackoverflow
Solution 12 - SqlAyush RajView Answer on Stackoverflow
Solution 13 - SqlAndreiView Answer on Stackoverflow
Solution 14 - SqlSergetView Answer on Stackoverflow
Solution 15 - SqlMartín FixmanView Answer on Stackoverflow
Solution 16 - SqlC-Pound GuruView Answer on Stackoverflow
Solution 17 - SqlImran ShView Answer on Stackoverflow
Solution 18 - SqlDaveXView Answer on Stackoverflow
Solution 19 - SqlBrian ConnellyView Answer on Stackoverflow
Solution 20 - SqlIstiaque HossainView Answer on Stackoverflow
Solution 21 - SqlTigerTigerView Answer on Stackoverflow
Solution 22 - SqlSparhawk_View Answer on Stackoverflow
Solution 23 - SqlDeep ShahView Answer on Stackoverflow
Solution 24 - SqlskrillybrickView Answer on Stackoverflow
Solution 25 - SqlVzzarrView Answer on Stackoverflow
Solution 26 - SqlRomain LinsolasView Answer on Stackoverflow