Sql 分组依据为空时选择子查询
我有一个疑问,我想不通Sql 分组依据为空时选择子查询,sql,postgresql,group-by,subquery,Sql,Postgresql,Group By,Subquery,我有一个疑问,我想不通 SELECT ( SELECT COUNT(bar.id) FROM bar WHERE foo.some_id = bar.some_id ) AS num_bar FROM foo GROUP BY some_id 如果foo看起来像这样: ID|some_id ---------- 1 |NULL 2 |apple 3 |orange 酒吧看起来像这样 ID|some_id ---------- 1 |NULL 2 |apple 3 |o
SELECT (
SELECT COUNT(bar.id)
FROM bar
WHERE foo.some_id = bar.some_id
) AS num_bar
FROM foo
GROUP BY some_id
如果foo看起来像这样:
ID|some_id
----------
1 |NULL
2 |apple
3 |orange
酒吧看起来像这样
ID|some_id
----------
1 |NULL
2 |apple
3 |orange
4 |NULL
5 |apple
6 |orange
我希望它会回来:
num_bar
-------
2
2
2
然而,NULL分组上的计数每次返回0
当group by为NULL时,解释WHERE子句的正确方法是什么?SQL聚合函数和比较在计算中可能忽略NULL值 您可能要做的是给它一个值,然后相应地解释null。因此,在下面的查询中,您要求查询将空值解释为-1
SELECT (
SELECT COUNT(bar.id)
FROM bar
WHERE isnull(foo.some_id, -1) = isnull(bar.some_id,-1)
) AS num_bar
FROM foo
GROUP BY isnull(some_id,-1)
如果我理解正确,您希望将
条形图中的某些id
与空值一起计算
不要在count
聚合中使用some\u id
,比如count(some\u id)
。当某个id为NULL
时,它将忽略NULL
值并始终返回零
这样试试
SELECT F.some_id,
Count(1) AS count_someid
FROM foo F
INNER JOIN bar B
ON F.some_id = B.some_id
OR ( F.some_id IS NULL AND B.some_id IS NULL ) -- To join NULL records
GROUP BY F.some_id
某些id中出现的空值
也将单独分组并计数这是一种与Nagendra Kakarla相同的逻辑更好的方法
SELECT F.some_id ,COUNT(1) AS count_someid
FROM FOO F
INNER JOIN BAR B ON ISNULL(F.some_id,'#') = ISNULL(B.some_id,'#')
GROUP BY F.some_id
你会得到这样的结果
+---------+--------------+
| some_id | count_someid |
+---------+--------------+
| NULL | 2 |
| apple | 2 |
| orange | 2 |
+---------+--------------+