当前位置: 首页 > 面试题库 >

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

经伟
2023-03-14
问题内容

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

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

  2. 我想以特定方式订购结果。在下面的查询中,由于ORDER BY按age_range,因此‘20-29’的结果位于’Under 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;


 类似资料:
  • 问题内容: 假设有一个与此问题类似的情况。我想得到以下结果: 我可以使用选定的答案作为解决方案: 我如何确保即使在该范围内没有任何结果,也将显示30-39的分数范围? 问题答案: 尝试以下查询(也在SQL Fiddle上): 编辑: 您可以通过将参数更改为轻松调整范围。可以使用以下构造来确保始终覆盖您的分数: 对于CTE。

  • 问题内容: 我想知道使用空块的目的是什么。例如, 有人可以解释 在什么情况下,我们要使用空块。 空块内的所有变量是否仍在继续? 为什么无法访问? 问题答案: 您在帖子中显示的块不是空块,而是静态初始化器。它用于为类的静态变量提供非平凡的初始化 在初始化期间使用的局部变量进入堆栈,但从堆分配的对象除外 您不能访问静态变量,因为您没有声明它。而是在静态初始化程序中声明了局部变量。 如果要创建静态变量,

  • 我想使用Lombok生成生成器,但我不确定这是否可行(我在文档中没有找到任何线索)。 默认情况下,Lombok生成builder,即此代码: 翻译为: 有没有办法在没有这个关键字的情况下生成构建器类?

  • 问题内容: Java中float和double的范围包括什么? 为什么不建议在精度要求很高的地方使用float或double? 问题答案: Java的类的成员包含类型的Min和Max值。 检出的和静态最终成员。 (有些)人们会建议不要在精度和精度至关重要的事情上使用浮点类型,因为舍入误差可能会使可测量(少量)的量不起作用。

  • 我在颤振中使用了一个很长的列表。所有项目都呈现良好,但我也收到以下错误: 以下是我的代码: 下面是我的方法: 下面是我的方法: 以下是错误的屏幕截图:

  • 问题内容: 给你 为什么不选择1-11? 他们是只是决定随机执行此操作,还是有一些我没有看到的价值? 问题答案: 因为调用包含10个等于的元素更为常见。请记住,程序员更喜欢基于0的索引。 另外,请考虑以下常见代码段: 你能看到如果精确到这将是有问题的吗?程序员需要显式减1。这也遵循程序员喜欢的共同趋势。 如果你经常以1开头的范围调用范围,则可能需要定义自己的函数: