mysql - 列的组总和并插入

标签 mysql sql select insert group-by

我这里的情况很特殊。我很抱歉这个问题太天真或不清楚。

我有一个表(称为 Table1),如下所示:

Student First Name | Last name  |  ID     | Test Name   | Result

Anthony            | Davis      | 12353   | abc_1_1    | Pass
Chris              | Tucker     | 23412   | abc_1_3    | Fail
Anthony            | Davis      | 12355   | abc_2_4    | Fail
Anthony            | Davis      | 12356   | abc_2_1    | Pass
Anthony            | Davis      | 12635   | abc_1-5    | Fail
Anthony            | Davis      | 12375   | abc_2_3    | Pass
Anthony            | Davis      | 12935   | abc_1_8    | Fail
Chris              | Tucker     | 23341   | abc_1_2    | Pass
Chris              | Tucker     | 23541   | abc_2_3    | Pass
Chris              | Tucker     | 23431   | abc_1_4    | Fail
Chris              | Tucker     | 21341   | abc_2_1    | Pass
Chris              | Tucker     | 32341   | abc_1_6    | Fail
David              | Steel      | 34352   | abc_2_3    | Fail
David              | Steel      | 34352   | abc_1_2    | Pass
David              | Steel      | 34352   | abc_2_4    | Fail
David              | Steel      | 34352   | abc_1_1    | Pass
David              | Steel      | 34352   | abc_1_7    | Fail

我想要实现的表(table2)是这样的:

Name         | Test Type | Pass | Fail

AnthonyDavis | Type_1    | 1    | 2
AnthonyDavis | Type_2    | 2    | 1
ChrisTucker  | Type_1    | 1    | 2
ChrisTucker  | Type_1    | 1    | 2
DavidSteel   | Type_1    | 2    | 1
DavidSteel   | Type_1    | 0    | 1

有没有可能实现这个是SQL? Table2 的主键是(名称,测试类型) 还是让临时表收集所需数据然后将其传输到 Table2 更容易?

最佳答案

假设 TestType 值基于 TestName 的前五个字符,那么您应该能够使用类似于此的方法来选择数据:

-- insert into Table2 (name, TestType, Pass, Fail)
select concat(StudentFirstName, Lastname) name,
  case left(TestName, 5)
      when 'abc_1' then 'Type_1'
      when 'abc_2' then 'Type_2'
    end testtype,
  sum(case when result = 'Pass' then 1 else 0 end) Pass,
  sum(case when result = 'Fail' then 1 else 0 end) Fail
from Table1
group by concat(StudentFirstName, Lastname), 
  case left(TestName, 5)
      when 'abc_1' then 'Type_1'
      when 'abc_2' then 'Type_2'
    end;

参见 SQL Fiddle with Demo .获得所需格式的数据后,您可以轻松地将其插入 Table2

如果我关于您如何获得 TestType 的假设不正确,请提供有关您如何确定这一点的详细信息。

注意,MySQL 允许在 GROUP BY 中使用来自 SELECT 的别名:

-- insert into Table2 (name, TestType, Pass, Fail)
select concat(StudentFirstName, Lastname) name,
  case left(TestName, 5)
      when 'abc_1' then 'Type_1'
      when 'abc_2' then 'Type_2'
    end testtype,
  sum(case when result = 'Pass' then 1 else 0 end) Pass,
  sum(case when result = 'Fail' then 1 else 0 end) Fail
from Table1
group by name, testtype;

关于mysql - 列的组总和并插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16464701/

相关文章:

mysql - 按 2 个值之间的平均评分排序

mysql - match() against() 并不总是有效

mysql - 查询一个报告的两个表(高级)

java - 如何确定 SOLR 索引的字段类型?

sql - 如何求两个选择的总和

mysql - 数据库触发器从其他表插入

mysql - 使用引用字段别名的子选择,MySQL 语句的 SQLite 中的等效项是什么

php - MySQL Select 选择 "or"并按该字段排序

sql - 此 sql 的 Rails 事件记录转换

mysql - 复杂搜索 SQL 查询