如何在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
从具有主键的表中分组,并从具有实际条目/细节的另一个表中计数。