我有一个我无法弄清楚的问题。
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
和bar看起来像这样
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子句的正确方法是什么?
答案 0 :(得分:1)
SQL聚合函数和比较可能会忽略计算中的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)
答案 1 :(得分:0)
如果我理解正确,您想要计算some_id
表格中bar
以及NULL's
。
不要在some_id
聚合中使用count
,例如count(some_id)
。当some_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
NULL's
中的 some_id
也会单独分组并计算
答案 2 :(得分:0)
使用与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 |
+---------+--------------+