使用 Where 和 GROUP BY 子句计算 SQL 中的空值



这是我拥有的测试表的示例数据

[childId] [parentId] [present]
1         10         0
2         11         1
3         NULL       0
4         NULL       0
NULL      10         0

现在,对于所有父 ID(包括带有 NULL 的 ID(,我想计算所有当前的子 ID

select parentId, count(childId) as nbr
from TestTable
where present=1 or parentId is NULL
group by parentId

我得到的结果是

parentId    nbr
NULL        2
11          1

我得到的相同计数数 ( nbr ( 对于现在=1 和现在=0。看来我不能对NULL分组值强加条件。
我犯了什么错误,我想做的查询的解决方案是什么?


更新:

由于我给出的测试用例不具有代表性,在我以更好的方式重现真实情况之前,我将尝试解释我面临的问题。

创建了一个具有完全外部连接的视图,因此我有一些记录具有childIdNULL,而一些记录具有NULL用于parentId
现在,我想列出所有parentId值(NULL 和非 NULL (,并为每个值计算所有记录,例如,具有present=1。如果我使用where present=1条件,它会从结果集中消除 NULL 值,即我不会有parentId|nbr的结果记录NULL|x
我用union all解决了这个问题.在第一个选择中,我有where present=1,在第二个选择中,我有where present=1 and parentId is NULL

select parentId, count(childId) as nbr
from TestTable
where present=0
group by parentId
union all
select parentId, count(childId) as nbr
from TestTable
where present=0 and parentId is NULL
group by parentId

我得到的结果是

    [parentId]  [nbr]
    NULL        2
    10          1
    NULL        2

唯一的问题(除了parentId=NULL的重复记录(,是如果没有带有 parentId=NULLpresent=1 的记录,结果我将没有parentId|nbrNULL | 0记录,我想列出所有 parentId,包括 NULL 而不是 NULL
所以总而言之,我需要有这种输出格式的present=1

    [parentId]  [nbr]
    NULL        0
    10          0
    11          1

而这个是present=0

    [parentId]  [nbr]
    NULL        2
    10          2
    11          0

有什么帮助吗?

where present=1 or parentId is NULL

就是这样。您有 Present = 1 或父 ID 为空。没有子句说父 ID 应该为 null,而 presentID 应该是 1。

你到底想完成什么?

要列出所有存在 = 1 的非空父 ID 和所有空父 ID 而不考虑存在,您可以使用 where 子句,但将组编辑为 GROUP BY parentid, present 。这样,您将显示所有非空值(当前为 1(和所有空值(当前为 0 和 1(。

更新:根据您的新要求,您还需要针对不存在的组合进行分组。您的数据集中没有任何地方有 NULL,1 值 - 因此您看待它的普通方式没有多大意义。您需要将父 ID 和呈现彼此分开。

一种方法是简单地执行以下操作:

SELECT parentID, Pres1.nbr_pres_1, Pres0.nbr_pres_0
FROM t
OUTER APPLY (SELECT COUNT(1) as nbr_pres_1 FROM t t1 WHERE 
             coalesce( t.parentid , -999) = coalesce(t1.parentid ,-999) and present=1 ) Pres1
OUTER APPLY (SELECT COUNT(1) as nbr_pres_0 FROM t t0 WHERE 
             coalesce( t.parentid , -999) = coalesce(t0.parentid ,-999) and present=0 ) Pres0
GROUP BY t.ParentID, Pres1.nbr_pres_1, Pres0.nbr_pres_0

这是基于使用 sqlfiddle 和您的示例数据集进行测试。 http://sqlfiddle.com/#!3/8d7f6/29

使用当前字段的 SUM 聚合,将位字段转换为整数,如下所示:

SELECT parentId, SUM(CAST(present AS INTEGER)) as nbr
FROM TestTable
GROUP BY parentId

如果这是您要查找的结果:

pId    nbr
NULL   1
10     0
11     1

那么我认为这就是您正在寻找的sql(尚未测试,没有可用的服务器(:

select distinct 
  parentId as pId, 
  (select count(*) from TestTable where parentId=pId and present=1) as nbr
from TestTable 
group by parentId

试试下面提到的代码片段。

SELECT ParentId, COUNT(ChildId) nbr FROM SO

其中(存在 = 1(或(父 ID 为空且存在 = 1(按父 ID 分组

-

-或者您也可以尝试下面提到的代码。

SELECT ParentId, COUNT(ChildId) nbr FROM SO

存在 = 1按父 ID 分组

最新更新