데이터 공부/SQL

[LeetCode] 1280. Students and Examinations (CROSS JOIN, LEFT JOIN)

민몽 2024. 8. 7. 23:43
📖 문제

 

학생들이 시험에 참여한 횟수 구하기

조건 : student_id, subject_name 순으로 오름차순 정렬

🔗Link : https://leetcode.com/problems/students-and-examinations/?envType=study-plan-v2&envId=top-sql-50

 

👀 What I Learned

   

     먼저 기준이 되는 열을 만든 후, 계산 필드를 생성하자 !

    아직 조인에 대한 이해가 부족한 것이 느껴져서 조인 결과를 확인해가며 쿼리 작성하기 ! 

📖 풀이 과정
SELECT st.student_id, st.student_name, su.subject_name, COUNT(e.student_id) as attended_exams
FROM Students st
    CROSS JOIN Subjects su
    LEFT JOIN Examinations e
        ON st.student_id = e.student_id AND su.subject_name = e.subject_name
GROUP BY st.student_id, st.student_name, su.subject_name
ORDER BY st.student_id, su.subject_name

 

1️⃣ 각 학생 당 모든 과목 별 시험 참여 횟수를 구해야 하므로 Student 와 Subjects 테이블 CROSS JOIN

* CROSS JOIN : 모든 경우의 수 ( A 테이블 row 수 x  B 테이블 row 수) 에 대한 테이블 출력 (Cartesian Product, 카티션 곱)

SELECT *
FROM Students st
    CROSS JOIN Subjects su

 

2️⃣ 과목 당 시험 참여수를 계산하기 위해 Examinations 테이블 LEFT JOIN

SELECT *
FROM Students st
    CROSS JOIN Subjects su
    LEFT JOIN Examinations e
    	ON st.student_id = e.student_id AND su.subject_name = e.subject_name

 

 

3️⃣ 앞의 세 열을 기준으로 그룹화 & 마지막 열 (e.student_id) 개수 카운트 + 조건에 맞게 정렬 하기

SELECT st.student_id, st.student_name, su.subject_name, COUNT(e.student_id) as attended_exams
FROM Students st
    CROSS JOIN Subjects su
    LEFT JOIN Examinations e
        ON st.student_id = e.student_id AND su.subject_name = e.subject_name
GROUP BY st.student_id, st.student_name, su.subject_name
ORDER BY st.student_id, su.subject_name