2017-07-07 88 views
1

我有这两个表:如何包括查询零计数结果

运营商:

Id Nome 
--+---- 
1 JDOE 
2 RROE 
3 MMOE 

电话:

Id CallDate OpId 
--+--------+---- 
1 20161228 2 
2 20161228 3 
3 20161228 2 
4 20161228 3 
5 20170104 1 
6 20170104 2 
7 20170104 1  

而这个查询:

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; 

其中返回:

Id Nome CountCalls 
--+----+---------- 
1 JDOE   2 
2 RROE   1 

我该如何让它返回呢?

Id Nome CountCalls 
--+----+---------- 
1 JDOE   2 
2 RROE   1 
3 MMOE   0 

即,如何在任何查询包括也由具有在左接合表中没有发生,至少在由查询过滤标准中定义的数据切片主表中的结果为零?

PS。这是访问2013

PS2。我读过this answer,但看不出与我所做的有什么不同,所以如果有人能在帮我复制我之前帮助我(也可能有相同的疑问),我将非常感激。

非常感谢!

+0

不要引用任何LEFT在WHERE子句谓词不允许空值加入表列。 – Serg

回答

4

因为您在HAVING子句中提及Calls.CallDate,所以您将删除没有呼叫的运营商。如果没有呼叫,则CallDate将是NULL,并且NULL=20170104不是真的,因此这些行被排除。你需要这个谓词移动到连接语句:

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,因为你只有一个,所以你可以只使用:

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

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如果你想郝晓红上CountCalls,例如,如果你只是想操作符取得了超过1叫你可以使用:

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; 

这只会返回下面q

Id Nome CountCalls 
--+----+---------- 
1 JDOE   2 
+0

只是一个观察:因为这些更改已完成,MS-Access将拒绝在设计模式下显示此查询,它将只能用作SQL或结果视图。显然,它的接口不能处理这个更复杂的Join子句。在MS上对此感到羞耻... – VBobCat

+0

好吧,对于任何非典型连接都是如此,我也不会因此而羞耻MS。它们无法在设计视图中正确表示,并且在查询中不应该隐藏元素,这些元素在那里没有表示。 –

1

尝试uery:

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; 

输出:

+------+------+------------+ 
| id | name | countcalls | 
+------+------+------------+ 
| 1 | JDOE |   2 | 
| 2 | RROE |   1 | 
| 3 | MMOE |   0 | 
+------+------+------------+