mysql - 根据值对行进行分组并插入到另一个表中

标签 mysql sql group-by

我有一个看起来像这样的表格

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 BYIF 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

参见SQL Fiddle with Demo .

如果您不想在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

参见SQL Fiddle with Demo .

我建议您考虑创建一个开始/结束范围与此类似的表格:

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`

参见SQL Fiddle with Demo

关于mysql - 根据值对行进行分组并插入到另一个表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15251411/

相关文章:

php - 从多个表复制数据并插入到一个表中?

php - 在 "src"字段中使用数据库镜像 BLOB

php - 表单提交处理和生成

mysql - 在 SQL 中将行转置为列

MySQL仅输出n行并将其余行分组为第n + 1行

mysql - TypeORM QueryRunner 选择不同的

sql - 学习编写复杂的报表查询的最佳在线SQL教程是什么?

java - SQLiteDatabase.rawQuery 不使用准备好的语句返回正确的结果

sql - 有没有办法用 t-sql 创建 "pivot group"列?

mysql - 使用 mysql 变量连接