我是SQL的新手,我在使用计数查询时遇到了麻烦。我想计算返回值的结果数,如果值为null,则返回第二个计数。
这是我到目前为止所拥有的。如果有人可以提供帮助,我会很感激。感谢。
Select
Sum(Case When Column name = '!NULL' Then 1 Else 0 End) as [Policy ID],
Sum(Case When Column name = 'NULL' Then 1 Else 0 End) as [No Policy Id]
--Count(*) as [Total]
From
table.name
Where
columnname >= '2016-01-01'
答案 0 :(得分:4)
使用IS NULL
和IS NOT NULL
而不是检查具有相等性的空值:
SELECT
SUM(CASE WHEN Column_name IS NOT NULL THEN 1 ELSE 0 END) AS [Policy ID],
SUM(CASE WHEN Column_name IS NULL THEN 1 ELSE 0 END) AS [No Policy Id]
--COUNT(*) AS [Total]
FROM table.name
WHERE columnname >= '2016-01-01'
在SQL中,值NULL
表示“未知”,因此使用=
将列值与它进行比较也会产生未知结果。相反,请使用IS NULL
或IS NOT NULL
。
答案 1 :(得分:1)
@TimBiegelesien的答案是对的,我唯一要添加/建议的是,如果ColumnName包含一个空字符串(''),你想把它算作NULL
,你可以这样做:
Select
Sum(Case When LENGTH(ColumnName) > 0 Then 1 Else 0 End) as [Policy ID],
Sum(Case When LENGTH(ColumnName) < 1 Then 1 Else 0 End) as [No Policy Id]
--Count(*) as [Total]
From table.name
Where columnname >= '2016-01-01'
注意在某些rdbms中LENGTH实际上是LEN
Select
Sum(Case When LEN(ColumnName) > 0 Then 1 Else 0 End) as [Policy ID],
Sum(Case When LEN(ColumnName) < 1 Then 1 Else 0 End) as [No Policy Id]
--Count(*) as [Total]
From table.name
Where columnname >= '2016-01-01'
即使数据类型是数字(int,bigint等)
,这仍然有效答案 2 :(得分:1)
以下是使用两个单独查询的示例:
SELECT COUNT(CASE WHEN LEN(columnname) > 1 THEN 1 ELSE 0 END) AS [Policy ID] FROM table.name
WHERE columnname >= '2016-01-01';
SELECT COUNT(CASE WHEN columnname IS NULL THEN 1 ELSE NULL END)
AS [No Policy ID] FROM table.name
WHERE columnname >= '2016-01-01';