将按查询分组的空值显示为零

时间:2019-03-05 10:53:07

标签: sql group-by null

我有两个表,任务和状态。任务表具有列task_id,project_id task_content和status_id。状态表具有列status_id和status_name。 我想查询所有状态名称并计算有多少具有该状态名称的任务。我的查询如下:

编辑:我忘记添加project_id。查询只需要检查一个项目中的任务。

SELECT s.status_name, COUNT(t.status_id) AS tasks
FROM status s
LEFT JOIN tasks t
ON s.status_id = t.status_id
WHERE t.project_id = 1
GROUP BY s.status_name

我的查询工作正常,但是当没有状态之一的任务时,此状态从查询中删除,我希望它显示为零,例如:

    status name | tasks 
     status 1   |  3 
     status 2   |  2
     status 3   |  0

但我的查询如下:

status name | tasks 
 status 1   |  3 
 status 2   |  2

5 个答案:

答案 0 :(得分:0)

这是基于原始帖子的答案(在进行任何编辑之前):

t.status_id内使用column_name(即count()):

SELECT s.status_name, COUNT(t.status_id) AS tasks
FROM status s LEFT JOIN 
     tasks t
     ON s.status_id = t.status_id
GROUP BY s.status_name;

答案 1 :(得分:0)

尝试以下方法-使用count(t.status_id)代替count(*)

SELECT s.status_id,s.status_name, COUNT(t.status_id) AS tasks
    FROM status s
    LEFT JOIN tasks t
    ON s.status_id = t.status_id
    GROUP BY s.status_id,s.status_name

答案 2 :(得分:0)

尝试如下

SELECT s.status_name, COUNT(t.status_id) AS tasks
FROM status s
LEFT JOIN tasks t
ON s.status_id = t.status_id
GROUP BY s.status_name

请注意,您还需要在左侧表格中status 3使用此值,否则它将以其他名称出现

答案 3 :(得分:0)

感谢大家的帮助,我找到了解决方案。我将其发布给以后遇到相同或相似问题的每个人。使用“ WHERE”弄乱了我的左联接,所以有解决方法:

SELECT s.status_name, (IFNULL(COUNT(t.task_id), 0)) AS tasks
FROM status s 
LEFT OUTER JOIN tasks t
ON  s.status_id = t.status_id 
AND t.project_id = 1 
GROUP BY s.status_name 

答案 4 :(得分:0)

只需将where条件移动到on子句:

SELECT s.status_name, COUNT(t.status_id) AS tasks
FROM status s LEFT JOIN
     tasks t
     ON s.status_id = t.status_id AND
        t.project_id = 1
GROUP BY s.status_name;

COUNT()从不返回NULL值,因此您不需要任何额外的检查。如果没有匹配项,它将返回0