2013-05-09 51 views
0

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

我有一个看起来像这样的表(称为表1):

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 

表(表2)我试图实现的是这样的:

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) 或者是更容易有一个临时表收集所需的数据,然后将其转移到表2?

+3

你怎么'测试Type'? – 2013-05-09 14:53:21

+0

这是基于测试名称的最后部分的数字 即:abc_1_1属于类型1 如果有一个名为abc_45_2的测试,它将是类型45 – 2013-05-09 15:10:10

回答

4

假设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允许从SELECT别名在GROUP BY使用:

-- 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; 
+0

对于这个问题,MySQL还允许'Pass'和'失败“分别定义为SUM(result ='Pass')'和SUM(result ='Fail')'。 :) – eggyal 2013-05-09 15:12:44

+0

你能解释一下这句话:“case left(testname,5)”吗? – 2013-05-09 15:17:52

+0

@KumaranSenapathy您没有指定如何确定测试类型,通过查看数据看起来有两个以'abc_1'和'abc_2'开头的测试。我认为这是你如何确定不同的类型。结果,我从testName列中选择了左边的5个字符。这然后用于获取文本类型。 – Taryn 2013-05-09 15:20:19