【问题标题】:Group sum of a column and insert对列的总和进行分组并插入
【发布时间】:2013-05-09 14:50:37
【问题描述】:

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

我有一个表格(称为 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? primary key for Table2 is (Name,Test Type) 还是让一个临时表收集所需的数据然后将其传输到 Table2 更容易?

【问题讨论】:

  • 你是怎么得到Test Type的?
  • 这是基于测试名称最后一部分中的数字,即:如果有一个名为 abc_45_2 的测试,abc_1_1 属于类型 1,那么它将是类型 45

标签: mysql sql select insert group-by


【解决方案1】:

假设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 还允许将PassFail 分别定义为SUM(result='Pass')SUM(result='Fail')。 :)
  • 你能解释一下“case left (testname,5)”这个语句吗?
  • @KumaranSenapathy 您没有指定如何确定测试类型,通过查看数据似乎有两个测试以abc_1abc_2 开头。我假设这就是您确定不同类型的方式。结果,我从 testName 列中选择了左边的 5 个字符。然后使用它来获取文本类型。
  • 另外..当你使用abc_1然后输入1时,它不会把abc_10_2变成1而不是10吗?
  • @KumaranSenapathy 正如我所说,您需要解释如何确定测试类型。我根据您提供的有限信息做了一个假设。您只展示了两个版本,如果您有更多版本,则需要相应地更改代码。
猜你喜欢
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-08
相关资源
最近更新 更多