2013-05-09 54 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