我有一张桌子

create table us
(
 a number
);

现在我有如下数据:

a
1
2
3
4
null
null
null
8
9

现在我需要一个查询来计算列a中的空值和非空值


当前回答

为了提供另一种选择,Postgres 9.4+允许对聚合应用FILTER:

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

其他回答

我有一个类似的问题:要计算所有不同的值,空值也算作1。简单的计数在这种情况下不起作用,因为它不考虑空值。

下面是一个适用于SQL的代码片段,不涉及选择新值。 基本上,执行distinct后,还使用row_number()函数返回新列(n)中的行号,然后对该列执行计数:

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

Try

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

简单!

使用ISNULL嵌入函数。


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个cols的记录,指示null和非null的计数。

这有点棘手。假设表只有一列,那么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(*)时,查询引擎会计算行数,所以我们得到Count result为16。但是对于Count(empid),它会对列empid中的非null值进行计数。结果是14。

所以每当我们使用计数(列),确保我们照顾空值如下所示。

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

将同时计算NULL和Non-NULL值。

注意:当表由多个列组成时,同样的情况也适用。Count(1)将给出总行数,而不考虑NULL/Non-NULL值。只有在使用Count(column)对列值进行计数时,我们才需要注意NULL值。