【问题标题】:Show null values in group by query as zero将查询分组中的空值显示为零
【发布时间】:2019-03-05 10:53:07
【问题描述】:

我有两个表,任务和状态。任务表有列 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

【问题讨论】:

  • count(t.status_id) 而不是 count(*)
  • @a_horse_with_no_name 我仍然得到相同的输出

标签: sql group-by null


【解决方案1】:

感谢大家的帮助,我找到了解决方案。我会将它发布给将来遇到相同或类似问题的每个人。使用 '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 

【讨论】:

    【解决方案2】:

    只需将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

    【讨论】:

      【解决方案3】:

      试试下面 - 使用 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
      

      【讨论】:

      • 还是一样的结果,当没有该状态的行时,还有其他方法可以显示 0 吗?
      • 你的状态表中有没有状态 3 @iposave
      • 是的,我有,但是对于其他项目中的其他任务,我忘了补充说我现在要编辑问题。
      【解决方案4】:

      尝试如下

      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这个值在你的左表中然后它会出现这个名字,否则它不会

      【讨论】:

      • 还是一样的结果
      • 我现在有这个查询错误。但是,我不知道哪个状态是空的,这只是一个例子,有没有更简单的方法可以为现在没有任务的状态显示 0?
      • 状态字段中没有值,无法显示该状态
      • 我在状态表中有这个状态,但现在在任务表中没有,直到有任务进入这个状态。
      • @iposave 如果您在状态表上具有该状态,那么它应该可以工作,因为左连接选择左表的所有值,因此状态在您的左侧,所以没有问题
      【解决方案5】:

      此问题基于原始帖子(在进行任何编辑之前):

      count() 中使用column_name(即t.status_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
      GROUP BY s.status_name;
      

      【讨论】:

      • 像其他查询一样工作,但是如果没有具有其中一种状态的任务,有没有办法显示 0?
      猜你喜欢
      • 2021-04-08
      • 2017-07-10
      • 2013-01-13
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 2021-02-01
      • 1970-01-01
      • 2022-06-13
      相关资源
      最近更新 更多