需要帮助计算SQL中同一个表中的不同值

时间:2016-08-08 16:16:53

标签: sql count

我是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'

3 个答案:

答案 0 :(得分:4)

使用IS NULLIS 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 NULLIS 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';