Mysql按年龄分组

时间:2020-03-05 17:16:36

标签: mysql sql group-by count

我需要帮助,我需要创建这样的报告

age     | total<br>
<= 13   | 10
14      | 0
15      | 5
16      | 2
....    | ....

该报告是按年龄分组的,但是当<= 13岁以下的人进入13岁以下时,我无法得到报告, 这是我的查询,仅适用于相同的值,如何将13岁以下的值添加到13岁以下。

SELECT
              za_hours.za_hour AS age,
              IFNULL(COUNT(stonevoucherchild_claim_user_id), 0) AS total
            FROM
              (SELECT
                13 AS za_hour
              UNION
              SELECT
                14 AS za_hour
              UNION
              SELECT
                15 AS za_hour
              UNION
              SELECT
                16 AS za_hour
              UNION
              SELECT
                17 AS za_hour
              UNION
              SELECT
                18 AS za_hour
              UNION
              SELECT
                19 AS za_hour
              UNION
              SELECT
                20 AS za_hour
              UNION
              SELECT
                21 AS za_hour
              UNION
              SELECT
                22 AS za_hour
              UNION
              SELECT
                23 AS za_hour
              UNION
              SELECT
                24 AS za_hour
              UNION
              SELECT
                25 AS za_hour
              UNION
              SELECT
                26 AS za_hour
              UNION
              SELECT
                27 AS za_hour
              UNION
              SELECT
                28 AS za_hour
              UNION
              SELECT
                29 AS za_hour
              UNION
              SELECT
                30 AS za_hour) za_hours
              LEFT JOIN mu_users
                ON za_hours.za_hour = TIMESTAMPDIFF(YEAR, dob, CURDATE())
            GROUP BY za_hours.za_hour
            ORDER BY za_hours.za_hour;

为此请帮帮我,抱歉英语不好

2 个答案:

答案 0 :(得分:0)

我将使用范围比较;这是通过在union all派生表中定义一个开始和结束值来实现的;那么您可以使用between将用户分组。我们还可以为每个范围提供描述,以供在外部查询中使用:

select n.info, count(u.dob) total
from (
    select '<= 13' info, 0 start, 13 end 
    union all select '= 14', 14, 14
    union all select '= 15', 15, 15
    ...
    union all select '= 30', 30, 30
) n
left join mu_users u
    on timestampdiff(year, u.dob, curdate()) between n.start and n.end
group by n.info, n.start, n.end
order by n.start

答案 1 :(得分:0)

您可以按表达式或表达式的别名进行分组。在这种情况下,表达式可以是CASE语句:

SELECT
  CASE WHEN za_hours.za_hour <= 13
    THEN '<= 13'
    ELSE za_hours.za_hour
  END AS age,
  IFNULL(COUNT(stonevoucherchild_claim_user_id), 0) AS total
FROM
  (SELECT 13 AS za_hour UNION ...) za_hours
  LEFT JOIN mu_users
    ON za_hours.za_hour = TIMESTAMPDIFF(YEAR, dob, CURDATE())
GROUP BY age
ORDER BY MIN(za_hours.za_hour)

还要注意,COUNT(..)从不返回NULL。因此您可以替换

IFNULL(COUNT(stonevoucherchild_claim_user_id), 0) AS total

使用

COUNT(stonevoucherchild_claim_user_id) AS total