Подтвердить что ты не робот

Подсчет нулевых и ненулевых значений в одном запросе

У меня есть таблица

create table us
(
 a number
);

Теперь у меня есть данные вроде:

a
1
2
3
4
null
null
null
8
9

Теперь мне нужен один запрос для подсчета нулевых и не нулевых значений в столбце a

4b9b3361

Ответ 1

Это работает для Oracle и SQL Server (вы можете заставить его работать на другой СУБД):

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;

Ответ 2

Если я правильно понял, вы хотите считать все 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;

Ответ 3

Вот быстрая и грязная версия, которая работает на 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

Ответ 4

Как я понял ваш запрос, вы просто запускаете этот script и получаете Total Null, Total NotNull rows,

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

Ответ 5

обычно я использую этот трюк

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

Ответ 6

для ненулевых

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

В некоторых тестах на моей системе это стоит полное сканирование таблицы.

Ответ 7

Это немного сложно. Предположим, что таблица имеет только один столбец, тогда 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. Таким образом, мы получили результат как 14.

поэтому всякий раз, когда мы используем COUNT (столбец), убедитесь, что мы позаботимся о значениях NULL, как показано ниже.

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

будет считать значения как NULL, так и не NULL.

Примечание. То же самое применимо, даже если таблица состоит из нескольких столбцов. Счетчик (1) даст общее количество строк независимо от значений NULL/Non-NULL. Только когда значения столбцов подсчитываются с использованием Count (Column), нам нужно заботиться о значениях NULL.

Ответ 9

У меня была аналогичная проблема: считать все различные значения, считая нулевые значения равными 1. В этом случае простой счетчик не работает, так как он не учитывает нулевые значения.

Вот фрагмент, который работает на SQL и не включает в себя выбор новых значений. В принципе, после выполнения отдельной строки также возвращайте номер строки в новом столбце (n) с помощью функции row_number(), затем выполните подсчет этого столбца:

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

Ответ 10

Если вы используете 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;

Я не рекомендую вам делать это... но здесь у вас есть (в той же таблице, что и результат)

Ответ 11

использовать встроенную функцию ISNULL.


Ответ 12

Вот два решения:

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

Ответ 13

Try

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

Simple!

Ответ 14

Попробуй это..

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 

Ответ 15

если его 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

Ответ 16

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

Это fugly, но он вернет одну запись с 2 столбцами, указывающую количество нулей против ненулевых значений.

Ответ 17

select count(isnull(NullableColumn,-1))

Ответ 18

Это работает в 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')

Ответ 19

Построение Альберто, я добавил сверток.

 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;

Ответ 20

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

Ответ 21

Я создал таблицу в Postgres 10, и оба следующих работали:

select count(*) from us

а также

select count(a is null) from us

Ответ 22

На всякий случай, если вы хотите его в одной записи:

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

; -)

Ответ 23

для подсчета не нулевых значений

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

для подсчета нулевых значений

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

Ответ 24

Все ответы либо неверны, либо крайне устарели.

Простой и правильный способ сделать этот запрос - использовать функцию COUNT_IF.

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

Ответ 25

Число элементов, где a равно null:

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

Число элементов, где a не равно null:

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