SQL:如果没有找到记录,则返回0计数

时间:2013-05-20 18:37:39

标签: sql oracle

一个非常简单的问题,因为它出现但在Oracle 10gXE上以某种方式不适合我。

基于my SQLFiddle,我必须显示所有员工姓名和计数(如果存在)或0如果没有找到状态= 2的记录

如何在单个查询中实现它而不在我的应用程序端调用Loop。

3 个答案:

答案 0 :(得分:5)

SELECT S.NAME,ISTATUS.STATUS,COUNT(ISTATUS.Q_ID) as TOTAL
FROM STAFF S
LEFT OUTER JOIN  QUESTION_STATUS ISTATUS
ON S.ID = ISTATUS.DONE_BY
AND ISTATUS.STATUS = 2 <--- instead of WHERE
GROUP BY S.NAME,ISTATUS.STATUS

通过在WHERE子句中进行过滤,过滤得太晚,并删除了您想要查看的STAFF行。将过滤器移动到连接条件意味着只过滤掉QUESTION_STATUS行。

请注意,此处STATUS并不是真正有用的专栏,因为除了2NULL之外,您不会得到任何其他结果,因此您可以省略它:

SELECT S.NAME,COUNT(ISTATUS.Q_ID) as TOTAL
FROM STAFF S
LEFT OUTER JOIN  QUESTION_STATUS ISTATUS
ON S.ID = ISTATUS.DONE_BY
AND ISTATUS.STATUS = 2
GROUP BY S.NAME

答案 1 :(得分:2)

我更正了你的sqlfiddle:http://sqlfiddle.com/#!4/90ba0/12

经验法则是过滤器必须出现在它们所依赖的表的ON状态中。

答案 2 :(得分:1)

将过滤器移动到LEFT JOIN中,同时使用COALESCE使结果显示0而不是您在问题中请求的null

select S.NAME,COALESCE(ISTATUS.STATUS,0),COUNT(ISTATUS.Q_ID) as TOTAL
from   STAFF S
LEFT  OUTER JOIN  QUESTION_STATUS ISTATUS
ON S.ID = ISTATUS.DONE_BY
AND  ISTATUS.STATUS =2
GROUP BY S.NAME,ISTATUS.STATUS