MySQL GROUP BY 年龄范围包括空范围

标签 mysql

我正在尝试按年龄范围计算人数,我几乎可以解决 2 个问题:

  1. 如果给定年龄范围内没有人 (NULL),则该年龄范围不会出现在结果中。例如,在我的数据中没有“超过 80 岁”的条目,因此不会出现该日期范围。基本上,当缺少日期范围时,这看起来像是编程错误。

  2. 我想以特定方式对结果进行排序。在下面的查询中,因为 ORDER BY 按 age_range 排序,所以“20 - 29”的结果排在“20 岁以下”的结果之前。

这是数据库表“查询”的示例:

inquiry_id  birth_date
1           1960-02-01
2           1962-03-04
3           1970-03-08
4           1980-03-02
5           1990-02-08

这是查询:

SELECT
    CASE
        WHEN age < 20 THEN 'Under 20'
        WHEN age BETWEEN 20 and 29 THEN '20 - 29'
        WHEN age BETWEEN 30 and 39 THEN '30 - 39'
        WHEN age BETWEEN 40 and 49 THEN '40 - 49'
        WHEN age BETWEEN 50 and 59 THEN '50 - 59'
        WHEN age BETWEEN 60 and 69 THEN '60 - 69'
        WHEN age BETWEEN 70 and 79 THEN '70 - 79'
        WHEN age >= 80 THEN 'Over 80'
        WHEN age IS NULL THEN 'Not Filled In (NULL)'
    END as age_range,
    COUNT(*) AS count

    FROM (SELECT TIMESTAMPDIFF(YEAR, birth_date, CURDATE()) AS age FROM inquiries) as derived

    GROUP BY age_range

    ORDER BY age_range

这是一个基于 Wrikken 建议的简单解决方案:

SELECT
    SUM(IF(age < 20,1,0)) as 'Under 20',
    SUM(IF(age BETWEEN 20 and 29,1,0)) as '20 - 29',
    SUM(IF(age BETWEEN 30 and 39,1,0)) as '30 - 39',
    SUM(IF(age BETWEEN 40 and 49,1,0)) as '40 - 49',
    SUM(IF(age BETWEEN 50 and 59,1,0)) as '50 - 59',
    SUM(IF(age BETWEEN 60 and 69,1,0)) as '60 - 69',
    SUM(IF(age BETWEEN 70 and 79,1,0)) as '70 - 79',
    SUM(IF(age >=80, 1, 0)) as 'Over 80',
    SUM(IF(age IS NULL, 1, 0)) as 'Not Filled In (NULL)'

FROM (SELECT TIMESTAMPDIFF(YEAR, birth_date, CURDATE()) AS age FROM inquiries) as derived

最佳答案

范围表的替代方案(这是我的偏好),单行答案可能是:

SELECT
    SUM(IF(age < 20,1,0)) as 'Under 20',
    SUM(IF(age BETWEEN 20 and 29,1,0)) as '20 - 29',
    SUM(IF(age BETWEEN 30 and 39,1,0)) as '30 - 39',
    SUM(IF(age BETWEEN 40 and 49,1,0)) as '40 - 49',
...etc.
FROM inquiries;

关于MySQL GROUP BY 年龄范围包括空范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3247630/

相关文章:

PHP - 存储 SELECT 查询并在 INSERT 查询中使用它

mysql - 选择多个表 MySQL

python - 如何将 django 中的数据从 sqlite 传输到 mysql,以便保留管理中的所有数据?

mysql - 在 Liquibase 中自动生成 UUID - Mysql MariaDB

mysql - 优化mysql索引

php - 使用mysql查询不使用任何循环打印相应数字的字符

java - 用户 'User_so' @'10.64.0.148' 的访问被拒绝(使用密码 : YES)

mysql - 尝试禁用外键检查,但不成功

mysql - 如何将Excel序列化日期时间导入MySQL

php - 将每一行用作包含的获取变量?