https://leetcode.com/problems/students-and-examinations/?envType=study-plan-v2&envId=top-sql-50
해당 과목의 시험을 한번도 안본 경우 0이 출력되도록 하는게 관건인 문제 ...
1. CROSS JOIN을 이용
CROSS JOIN을 이용하면 테이블간의 모든 가능한 조합이 생성된다
SELECT *
FROM students s
CROSS JOIN subjects sub
SELECT s.student_id,
s.student_name,
sub.subject_name,
COUNT(e.student_id) AS attended_exams
FROM students s
CROSS JOIN subjects sub
LEFT JOIN examinations e ON s.student_id = e.student_id
AND sub.subject_name = e.subject_name
GROUP BY s.student_id,
s.student_name,
sub.subject_name
ORDER BY s.student_id,
s.student_name
2. COALESCE() 이용
인자로 받은 값들을 순서대로 검사하고, NULL이 아닌 첫번째 값을 반환하는 함수
데이터 처리중에 NULL에 대한 기본값을 제공하거나 대체할 때 사용 가능
SELECT s.student_id,
s.student_name,
sub.subject_name,
COALESCE(e.attended_exams, 0) AS attended_exams -- attended_exams column이 NULL일 경우 0, 아닐 경우 값 반환
FROM students s
CROSS JOIN subjects sub
LEFT JOIN (
SELECT student_id, subject_name, COUNT(*) AS attended_exams
FROM examinations
GROUP BY student_id, subject_name) e -- examination 테이블을 한번 정리한 후 JOIN
ON s.student_id = e.student_id AND sub.subject_name = e.subject_name -- **
ORDER BY s.student_id,
sub.subject_name
/*
** JOIN 조건이 2개 이상인 경우
ON USING (student_id, subject_name) 으로 작성할 수도 있음
*/
** JOIN 조건이 2개인 경우 다르게 작성할 수도 있다
'SQL > 문제풀이' 카테고리의 다른 글
[LeetCode] average-selling-price 📌 (0) | 2024.03.05 |
---|---|
[LeetCode] monthly-transactions (0) | 2024.03.04 |
[LeetCode] confirmation-rate (0) | 2024.03.04 |
[LeetCode] average-time-of-process-per-machine (0) | 2024.03.04 |
[LeetCode] customers-who-bought-all-products (0) | 2024.03.04 |