2014-11-06 115 views
0

我正在創建一個應用程序來存儲測試。數據庫架構簡化下面SQL來獲得成績

id_student   id_teacher   grade second_test 

student_1    teacher_1   10 'Y' 
student_1    teacher_1   5  'N' 
student_2    teacher_1   8  'N' 
student_3    teacher_1   9  'N' 

我需要一個查詢來獲取每個學生考慮,如果該學生有第二次測試(這是一個檢索)等級返回必須在第二個測試的一個檔次(而不是第一個)。

因此,對於這個例子中,結果集應

student_1    teacher_1   10 'Y' 
student_2    teacher_1   8  'N' 
student_3    teacher_1   9  'N' 

我寫了一個SQL語句,但它不工作。因爲它不會得到student_2和student_3

SELECT 
    m.id_student, 
    m.grade 
FROM 
    mytable m 
WHERE 
    second_test = 'Y' 
    OR EXISTS (
    SELECT 1 
    FROM 
     mytable 
    WHERE 
     id_student = m.id_student 
     AND id_teacher <> m.id_teacher 
     AND second_test = 'Y' 
) 
+1

'where second_test ='Y''只會帶回學生1 – Matt 2014-11-06 10:54:18

+0

您可以給我們您的表格結構和領域請 – Matt 2014-11-06 10:57:38

+0

它在問題中給出。我幫你理解,但你究竟需要更多什麼? – gbvisconti 2014-11-06 10:59:00

回答

1

如果一個學生只能在你的表的一個或兩個記錄,你可以離開了參加第一次測試第二次測試。

select 
    t1.id_student, 
    t1.id_teacher, 
    coalesce(t2.grade,t1.grade) 
from 
    (select id_student, id_teacher, grade from my_table where second_test = 'N') as t1 
left join 
    (select id_student, id_teacher, grade from my_table where second_test = 'Y') as t2 
on 
    t1.id_student = t2.id_student and t1.id_teacher = t2.id_teacher 

如果一個學生可以有兩個以上的測試記錄,比你應該使用聚合方法在這兩個子querys。

+0

一個學生可以有多個測試,具體取決於有多少名教師應用測試,會有兩個測試(第一個測試和檢索)。我可以使用什麼聚合方法? – gbvisconti 2014-11-06 12:10:24

+0

如果是這樣,不需要更多聚合,只需在連接條件和子查詢中添加id_teacher即可。看到我更新的答案。 – 2014-11-06 12:14:19

+0

這是有效的!非常感謝您的幫助:) – gbvisconti 2014-11-06 12:19:18

1

你在這裏。 首先,讓所有有兩個年級的學生參加第二次考試,然後與那些只有一年級的學生合併。

SELECT 
    a.id_student, a.id_teacher, b.grade, b.second_test 
FROM (
    SELECT 
     id_student, id_teacher 
    FROM 
     mytable 
    GROUP BY 1,2 
    HAVING COUNT(*) > 1 
    ) a 
    JOIN mytable b ON a.id_student = b.id_student AND a.id_teacher = b.id_teacher AND b.second_test = 'Y' 
UNION 
SELECT 
    a.id_student, a.id_teacher, b.grade, b.second_test 
FROM (
    SELECT 
     id_student, id_teacher 
    FROM 
     mytable 
    GROUP BY 1,2 
    HAVING COUNT(*) = 1 
    ) a 
    JOIN mytable b ON a.id_student = b.id_student AND a.id_teacher = b.id_teacher 

這個答案可以很容易地修改,以獲得最新的檔次,即使你將有5級爲每個學生(取決於標誌)。

+0

感謝您的幫助,但我使用Jaugar Chang的回答:) – gbvisconti 2014-11-06 12:20:47