我有一个看起来像这样的表格
Subject Mark Girls Boys
Math 85 4 6
Math 86 1 3
Math 87 1 9
Math 92 2 9
Math 96 9 4
English 83 4 5
English 87 2 4
English 91 2 3
English 99 4 1
我希望将这些数据插入到另一个看起来像的表中
Subject Range Girls Boys
Math 80-89 6 19
Math 90-99 11 13
English 80-89 6 9
English 90-99 6 4
假设只有两位数的分数,我应该查询什么来完成这个任务。
我尝试了非常天真的 GROUP BY
和 IF MARK like 1%
但惨败。
最佳答案
您可以使用CASE
表达式来创建范围。如果您有更多范围,则将它们添加到 CASE
中:
select subject,
case
when mark >= 80 and mark <= 89 then '80-89'
when mark >= 90 and mark <= 99 then '90-99'
end `Range`,
sum(girls) Girls,
sum(boys) Boys
from yourtable
group by subject, case
when mark >= 80 and mark <= 89 then '80-89'
when mark >= 90 and mark <= 99 then '90-99'
end
order by subject
如果您不想在GROUP BY
中重复CASE
,那么您可以使用子查询:
select subject,
`range`,
sum(girls) girls,
sum(boys) boys
from
(
select subject,
case
when mark >= 80 and mark <= 89 then '80-89'
when mark >= 90 and mark <= 99 then '90-99'
end `Range`,
girls,
boys
from yourtable
) src
group by subject, `range`
order by subject
我建议您考虑创建一个开始/结束范围与此类似的表格:
create table mark_ranges
(
start_range int,
end_range int
);
insert into mark_ranges values
(0, 9),
(10, 19),
(20, 29),
(30, 39),
(40, 49),
(50, 59),
(60, 69),
(70, 79),
(80, 89),
(90, 99);
创建表格后,通过加入表格即可轻松获取范围:
select subject,
`range`,
sum(girls) girls,
sum(boys) boys
from
(
select t.subject,
concat(r.start_range, '-', r.end_range) `range`,
t.girls,
t.boys
from yourtable t
inner join mark_ranges r
on t.mark >= r.start_range
and t.mark <= r.end_range
) src
group by subject, `range`
关于mysql - 根据值对行进行分组并插入到另一个表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15251411/