如何在COUNT聚合中包含“零”/“0”?

我刚刚得到了一些SQL的困扰。 我不认为我可以出色地提出这个问题 – 所以让我给你看看。

我有两张桌子,一个叫人,一个叫约会。 我试图返回一个人的约会数量(包括如果他们有零)。 约会包含person_id ,每个约会都有一个person_id 。 所以COUNT(person_id)是一个明智的方法。

查询:

 SELECT person_id, COUNT(person_id) AS "number_of_appointments" FROM appointment GROUP BY person_id; 

将正确返回一个person_id具有的约会的数量。 然而,一个没有任命的人不会被退回(显然,因为他们不在该表中)。

调整声明,从人表采取person_id给我这样的:

 SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments" FROM appointment JOIN person ON person.person_id = appointment.person_id GROUP BY person.person_id; 

但是,这仍然只会返回一个person_id有预约的人,而不是我想要的,这是一个有约会的人的回报!

有什么build议吗?

你需要一个外连接(你需要使用person作为“驾驶”表)

 SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments" FROM person LEFT JOIN appointment ON person.person_id = appointment.person_id GROUP BY person.person_id; 

这是工作的原因是外部(左)连接将返回NULL为那些没有约会的人。 聚合函数count()不会计算NULL值,因此您将得到一个零。

如果你想了解更多关于外部连接,这里是一个很好的教程: http : //sqlzoo.net/wiki/Using_Null

您必须使用LEFT JOIN而不是INNER JOIN

 SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments" FROM person LEFT JOIN appointment ON person.person_id = appointment.person_id GROUP BY person.person_id; 

如果你使用外连接(使用count),然后使用这个结果作为子表,你可以像预期的那样得到0(感谢nvl函数)

例如:

 select P.person_id, nvl(A.nb_apptmts, 0) from (SELECT person.person_id FROM person) P LEFT JOIN (select person_id, count(*) as nb_apptmts from appointment group by person_id) A ON P.person_id = A.person_id 

USEjoin使用GROUP BY得到0的结果。

简单的“join”就是在MS SQL内部join,所以左右连接。

如果在QUERY中首先提到包含主键的表,那么使用LEFT join或者RIGHT join。

例如:

 select WARDNO,count(WARDCODE) from MAIPADH right join MSWARDH on MSWARDH.WARDNO= MAIPADH.WARDCODE group by WARDNO 

 select WARDNO,count(WARDCODE) from MSWARDH left join MAIPADH on MSWARDH.WARDNO= MAIPADH.WARDCODE group by WARDNO 

从具有主键的表中分组,并从具有实际条目/细节的另一个表中计数。