首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在查询中包含零计数结果

如何在查询中包含零计数结果
EN

Stack Overflow用户
提问于 2017-07-07 13:24:36
回答 2查看 9.1K关注 0票数 4

我有两张桌子:

运营者:

代码语言:javascript
复制
Id Nome
--+----
 1 JDOE
 2 RROE
 3 MMOE

呼叫:

代码语言:javascript
复制
Id CallDate OpId
--+--------+----
 1 20161228    2
 2 20161228    3
 3 20161228    2
 4 20161228    3
 5 20170104    1
 6 20170104    2
 7 20170104    1    

这个问题是:

代码语言:javascript
复制
SELECT Operators.id, Operators.Nome, Count(Calls.OpId) AS CountCalls
FROM Operators LEFT JOIN Calls ON Operators.id = Calls.OpId
GROUP BY Calls.CallDate, Operators.id, Operators.Nome
HAVING Calls.CallDate=20170104;

返回:

代码语言:javascript
复制
Id Nome CountCalls
--+----+----------
 1 JDOE          2
 2 RROE          1

我怎么才能把这个还给你呢?

代码语言:javascript
复制
Id Nome CountCalls
--+----+----------
 1 JDOE          2
 2 RROE          1
 3 MMOE          0

也就是说,如何在任何查询中也包括主表的零结果,而主表在左联接表中没有出现,至少在查询过滤条件定义的数据片中是这样吗?

这是Access 2013。

我读过this answer,但看不出它和我在做什么有什么不同。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-07 13:35:08

因为在Calls.CallDate子句中有对HAVING的引用,所以在没有调用的地方要删除操作符。如果没有调用,那么CallDate将是NULL,而NULL=20170104不是真,因此这些行被排除在外。您需要将该谓词移动到join子句:

代码语言:javascript
复制
SELECT Operators.id, Operators.Nome, Count(Calls.OpId) AS CountCalls
FROM Operators LEFT JOIN Calls ON (Operators.id = Calls.OpId AND Calls.CallDate=20170104)
GROUP BY Calls.CallDate, Operators.id, Operators.Nome;

您也不需要按Calls.CallDate进行分组,因为反正只有一个,所以只需使用:

代码语言:javascript
复制
SELECT Operators.id, Operators.Nome, Count(Calls.OpId) AS CountCalls
FROM Operators LEFT JOIN Calls ON (Operators.id = Calls.OpId AND Calls.CallDate=20170104)
GROUP BY Operators.id, Operators.Nome;

作为旁白,HAVING是错误的运算符。HAVING用于过滤聚合,因为您没有过滤聚合,所以应该只使用WHERE

代码语言:javascript
复制
SELECT Operators.id, Operators.Nome, Count(Calls.OpId) AS CountCalls
FROM Operators LEFT JOIN Calls ON Operators.id = Calls.OpId
WHERE Calls.CallDate=20170104
GROUP BY Calls.CallDate, Operators.id, Operators.Nome;

如果您想在HAVING上使用fliter,例如,如果您只想使用超过一个呼叫的操作符,您可以使用CountCalls

代码语言:javascript
复制
SELECT Operators.id, Operators.Nome, Count(Calls.OpId) AS CountCalls
FROM Operators LEFT JOIN Calls ON Operators.id = Calls.OpId
WHERE Calls.CallDate=20170104
GROUP BY Calls.CallDate, Operators.id, Operators.Nome
HAVING Count(Calls.OpId) > 1;

这只会回来

代码语言:javascript
复制
Id Nome CountCalls
--+----+----------
 1 JDOE          2
票数 9
EN

Stack Overflow用户

发布于 2017-07-07 13:35:52

请尝试以下查询:

代码语言:javascript
复制
SELECT o.id, o.name, count(c.opid) as countcalls
FROM Operators o LEFT JOIN calls c ON o.id = c.opid AND c.calldate=20170104
GROUP BY c.calldate, o.id, o.name
ORDER BY o.id;

输出:

代码语言:javascript
复制
+------+------+------------+
| id   | name | countcalls |
+------+------+------------+
|    1 | JDOE |          2 |
|    2 | RROE |          1 |
|    3 | MMOE |          0 |
+------+------+------------+
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44971948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档