我的查询如下:
SELECT age_groups.Name as name, avg(scores.score) as avg
FROM scores
JOIN users ON scores.id = users.id
JOIN age_groups on user.age_group = age_groups.id;
有5个年龄组:0-10,11-20,21-30,31-40,41-50。
我想在我的成绩中只有三个年龄组:0-30岁,31-40岁和41-50岁。
哪些陈述允许我将三个年龄组分组在一起?
编辑:
age_groups表如下所示:
ID - Name
1 - 0-10
2 - 11-20
3 - 21-30
...etc
答案 0 :(得分:2)
您可以使用case
来结合年龄段。首先,您的查询缺少group by
,因此它应该更像是:
SELECT ag.Name as name, avg(s.score) as avg
FROM scores s JOIN
users u
ON s.id = u.id JOIN
age_groups ag
on u.age_group = ag.id
GROUP BY ag.Name;
然后你可以做你想做的事情:
SELECT (case when ag.Name in ('0-10', '11-20', '21-30') then '0-30'
else ag.Name
end) as MyAgeGroup, avg(s.score) as avg
FROM scores s JOIN
users u
ON s.id = u.id JOIN
age_groups ag
on u.age_group = ag.id
GROUP BY (case when ag.Name in ('0-10', '11-20', '21-30') then '0-30'
else ag.Name
end);
答案 1 :(得分:0)
一种解决方案是替换" age_groups.Name"在您的select子句中,使用case语句将每个贡献范围重新映射到您想要的范围:
CASE age_groups.Name
WHEN '0-10'
THEN '0-30'
WHEN '10-20'
THEN '0-30'
WHEN '20-30'
THEN '0-30'
ELSE age_groups.Name
END AS Name
并使用GROUP BY子句将其添加到底部(例如,GROUP BY CASE WHEN ...)
但是,如果这种类型的事情可能经常发生,那么我建议使用更长期的解决方案,即将年龄组表中的年龄组添加数字边界,例如Age_Group_Lower_Bound(整数)和Age_Group_Upper_Bound(整数) (例如,你的0-10行将有Age_Group_Lower_Bound = 0和Age_Group_Upper_Bound = 10)。完成这些后,您的原始查询可以使用这些,例如:
CASE
WHEN age_groups.Age_Group_Upper_Bound <= 30
THEN '0-30'
ELSE age_Groups.Name
END
以下是一个例子,进一步将更多范围组合在一起,例如:
CASE
WHEN age_groups.Age_Group_Upper_Bound <= 20
THEN '0-20'
WHEN age_groups.Age_Group_Upper_Bound <= 40
THEN '20-40'
WHEN age_groups.Age_Group_Upper_Bound <= 60
THEN '40-60'
ELSE '60+'
END