我有桌子
create table us
(
a number
);
现在我有类似的数据:
a
1
2
3
4
null
null
null
8
9
现在,我需要一个查询来计算a列中的空值和非空值
union
这里使用?蒙特克里斯托的答案是迄今为止最好的解决方案。
我有桌子
create table us
(
a number
);
现在我有类似的数据:
a
1
2
3
4
null
null
null
8
9
现在,我需要一个查询来计算a列中的空值和非空值
union
这里使用?蒙特克里斯托的答案是迄今为止最好的解决方案。
Answers:
这适用于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'
。单引号,而不是双引号。
据我了解您的查询,您只需运行此脚本并获得Total Null,Total NotNull行,
select count(*) - count(a) as 'Null', count(a) as 'Not Null' 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
在我的系统上进行的一些测试中,它需要进行全表扫描。
select count(*) from t where a is null
)执行此操作的地方。
为了提供另一种选择,Postgres 9.4+ 允许将a 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
这有点棘手。假设表只有一列,则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和Non-NULL值。
注意:即使表由多个列组成,也是如此。Count(1)将给出总行数,而与NULL / Non-NULL值无关。仅当使用Count(Column)对列值进行计数时,我们才需要注意NULL值。
我有一个类似的问题:计算所有不同的值,将空值也计算为1。在这种情况下,简单的计数不起作用,因为它不考虑空值。
这是一个适用于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 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;
简单!
试试这个..
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
这在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))
所有答案都是错误的或过时的。
执行此查询的简单正确方法是使用COUNT_IF
function。
SELECT
COUNT_IF(a IS NULL) AS nulls,
COUNT_IF(a IS NOT NULL) AS not_nulls
FROM
us
用于计算非空值
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)
将返回所有行的计数。
就我而言,我希望在多个列之间使用“ 空分布 ”:
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,...
按照“ ...”,它可以轻松扩展到更多列,并根据需要扩展