mysql - Mysql 按年龄分组
问题描述
我需要帮助,我需要创建这样的报告
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;
请帮助我,抱歉英语不好
解决方案
我会使用范围比较;这通过在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
推荐阅读
- database - 访问上月查询
- drools - 如何在 Drools 电子表格决策表中使用通配符?
- typescript - 如何制作通用的 JavaScript / TypeScript 库
- bash - 从 shell 脚本运行 gcloud?
- dataframe - 如何使用交替日期对数据框进行子集化?
- reactjs - 在 React 表中选择行数据
- python - 获取python嵌套字典中子值的平均值
- jenkins - 在我的多分支管道工作中看到的长时间延迟期间,詹金斯在做什么?
- reactjs - 状态管理 - 渲染不同组件时无法更新组件(`Provider`)
- ios - Cloudflare Stream Video 控件在 ios 上未正确显示