본문 바로가기
문제풀이/SQL(My sql)

[문제풀이] Leet code - Students and Examinations

by kime2 2024. 7. 22.
출처

 

문제

각 학생이 각 시험에 참석한 횟수를 찾는 솔루션을 작성합니다.
student_id및 subject_name로 정렬된 결과 테이블을 반환합니다.

 

문제에 대한 해석

 

 

풀이(MYSQL)

-- 1.학생, 과목 테이블 만들기
with base as (
    select *
    from Students, Subjects
),
-- 2. 학생, 과목별 시험의 수 집계
test as (
    select student_id,subject_name, count(*) as'attended_exams'
    from Examinations 
    group by student_id,subject_name
)
-- 1과 2 합치기
select base.student_id,base.student_name,base.subject_name, ifnull(test.attended_exams,0) as 'attended_exams'
from base left join test
on base.student_id = test.student_id
and base.subject_name = test.subject_name
order by base.student_id, base.subject_name

 

1번 학생, 시험과목 테이블 2번 test테이블
1번+ 2번 = 3번 3번, ifnull 없을 경우

 

각각의 테이블을 만들어 큰 테이블을 기준으로 조인하는데

이때 값이 없으면 null로 처리되므로 ifnull함수를 사용해 줘야 한다

다른사람 풀이

SELECT 
    Students.student_id, 
    Students.student_name, 
    Subjects.subject_name, 
    COUNT(Examinations.subject_name) as attended_exams -- 3. 학생, 과목별 집계
-- 1.학생, 시험과목 테이블 만들기
FROM Students
CROSS JOIN Subjects
-- 2. 학생, 시험과목 테이블을 기준으로 Examinations 조인 
LEFT JOIN Examinations 
ON Students.student_id=Examinations.student_id 
AND Examinations.subject_name=Subjects.subject_name
GROUP BY Students.student_id, Students.student_name, Subjects.subject_name
ORDER BY Students.student_id, Subjects.subject_name;

 

1번 학생, 시험과목 테이블 2. examinations테이블 조인 3. 집계처리