【问题标题】:I need help in mysql query where I want to group by age filter by in between age and show 0 count for data not found in between我在 mysql 查询中需要帮助,我想在年龄之间按年龄过滤器分组,并显示 0 计数之间找不到的数据
【发布时间】:2022-12-13 22:17:56
【问题描述】:

大家好,这是我第一次发布问题,祝我好运, 我在显示年龄组数据时遇到问题,这是我的查询

SELECT 
    CASE WHEN age BETWEEN 0 AND 18 OR age IS NULL THEN '0-18' 
         WHEN age BETWEEN 19 AND 30 THEN '19-30' 
         WHEN age BETWEEN 31 AND 35 THEN '31-35' 
         WHEN age BETWEEN 36 AND 50 THEN '36-50' 
        WHEN age BETWEEN 51 AND 100 THEN '50+' 
    END AS age_group, 
    COALESCE(COUNT(*), 0) AS count 
FROM patient_registration 
GROUP BY age_group;

我正在尝试运行上面的查询来显示数据,因为你可以看到上面的查询执行没有任何错误,但我需要一个针对年龄组的解决方案,例如,计数为 0。

我没有 0 到 18 岁之间的年龄记录,它没有显示在输出中,但我想像这样显示记录

age_group  count
0-18           0
19-30        192
31-35         83
36-50        223
50+          222

如果情况不满足我想显示计数 0 有没有我可以尝试的替代方法, 如果我无法正确解释我的问题,请原谅我 enter image description here

我试过这样的方法,但没有用

SELECT 
  CASE 
    WHEN age BETWEEN 0 AND 18 OR age COUNT is NULL THEN '0-18'
    WHEN age BETWEEN 19 AND 30 THEN '19-30'
    WHEN age BETWEEN 31 AND 35 THEN '31-35'
    WHEN age BETWEEN 36 AND 50 THEN '36-50'
    WHEN age BETWEEN 51 AND 100 THEN '50+'
  END AS age_group, 
  COALESCE(COUNT(*), NULL) AS count
FROM patient_registration
GROUP BY age_group;

【问题讨论】:

  • 请分享更多详细信息,例如表结构、示例输入数据、与该数据对应的预期输出以及您解决问题的尝试
  • 还有你的 MySQL 版本号
  • 合成范围子查询(from-till-name)并将表左连接到它。

标签: mysql sql


【解决方案1】:

为了达到你想要的结果,你必须使用一个虚拟表,然后使用 LEFT join 来生成这个结果 -

SELECT age_group,
       coalesce(count(*),0) as cnt
  FROM (SELECT '0-18' age_grp
         UNION ALL
        SELECT '19-30'
         UNION ALL
        SELECT '31-35'
         UNION ALL
        SELECT '36-50'
         UNION ALL
        SELECT '50+'
      ) all_grp
  LEFT JOIN (SELECT CASE WHEN age BETWEEN 0 AND 18 OR age IS NULL THEN '0-18' 
                         WHEN age BETWEEN 19 AND 30 THEN '19-30' 
                         WHEN age BETWEEN 31 AND 35 THEN '31-35' 
                         WHEN age BETWEEN 36 AND 50 THEN '36-50' 
                         WHEN age BETWEEN 51 AND 100 THEN '50+' 
                    END AS age_group, 
                    COUNT(*) AS count 
               FROM patient_registration 
              GROUP BY age_group
              ) d ON all_grp.age_grp = d.age_group;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多