我需要帮助,我需要创建这样的报告
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;
为此请帮帮我,抱歉英语不好
答案 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