2014-11-06 2 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' 

아래 단순화 (첫 번째가 아님).

은 그래서 예를 들어, 결과 세트 내가 SQL을 썼다

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

해야하지만, 제대로 동작하지 않습니다. 한 학생은 테이블에 하나 개 또는 두 개의 기록이 할 수있는 경우는 student_2을 얻고

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

'second_test = 'Y''는 학생 1 만 가져올 것입니다 – Matt

+0

테이블 구조와 필드를 알려주십시오. – Matt

+0

질문에 주어졌습니다. 나는 당신이 이해하는 것을 도울 것이지만, 당신은 정확히 무엇이 더 필요합니까? – gbvisconti

답변

1

을 student_3하지 않습니다 때문에, 당신은 두 번째 테스트로 첫 번째 테스트에 참여 남아 있었다.

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 

두 명의 하위 쿼리에서 집계 방법을 사용해야하는 것보다 한 학생이 두 개 이상의 테스트 레코드를 가질 수 있습니다.

+0

교사가 적용한 테스트의 수에 따라 하나의 학생이 여러 개의 테스트를 가질 수 있습니다 두 가지 테스트 (첫 번째 테스트 및 검색)가 있습니다. 어떤 집계 방법을 사용할 수 있습니까? – gbvisconti

+0

그렇다면 더 많은 집계가 필요하지 않으며 조인 조건과 하위 쿼리에 id_teacher를 추가하십시오. 내 업데이트 답변을 참조하십시오. –

+0

그게 효과가! 도와 주셔서 감사합니다 :) – gbvisconti

1

여기 있습니다. 먼저 두 가지 성적을 가진 모든 학생들을 데리고 두 번째 시험에서 하나를 택한 다음 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 장의 대답을 사용 :) – gbvisconti

관련 문제