📖 문제
학생들이 시험에 참여한 횟수 구하기
조건 : 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
'데이터 공부 > SQL' 카테고리의 다른 글
[프로그래머스] 조건에 맞는 사용자 정보 조회하기 CONCAT_WS (0) | 2024.10.14 |
---|---|
[LeetCode] 1204.Last Person to Fit in the Bus (From 절 Subquery, 누적합) (0) | 2024.08.22 |
[LeetCode] 550. Game Play Analysis IV (Where절 Subquery) (0) | 2024.08.13 |
[LeetCode] 1174. Immediate Food Delivery II (Where절 Subquery, 집계함수) (0) | 2024.08.12 |
[MYSQL] LEAG, LAG (0) | 2023.01.12 |