SQL Query更改组子句

时间:2014-09-15 16:16:31

标签: mysql sql

我的查询如下:

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

2 个答案:

答案 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