SQL/문제풀이

[LeetCode] students-and-examinations 📌

응엉잉 2024. 3. 4. 16:11

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

 

Students and Examinations - LeetCode

Can you solve this real interview question? Students and Examinations - Table: Students +---------------+---------+ | Column Name | Type | +---------------+---------+ | student_id | int | | student_name | varchar | +---------------+---------+ student_id is

leetcode.com

해당 과목의 시험을 한번도 안본 경우 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개인 경우 다르게 작성할 수도 있다