[LeetCode/SQL] 1280. Students and Examinations

Sooyeon·2023년 11월 14일
0

문제풀이 

목록 보기
43/95
post-thumbnail

[LeetCode/SQL]


📌 1280. Students and Examinations

문제

풀이

- 각 학생별로 참여한 시험의 수를 출력하라 
- student_id와 subject_name 기준으로 정렬하라 
- 단 모든 학생과 모든 과목을 출력해야 한다. 
=> 참여하지 않은 시험과목도 출력해야한다

=> 이를 위해 학생 과 과목 테이블의 모든 경우의 수 출력을 위해 , CROSS JOIN수행 
=> 각 학생별 참여한 시험의 개수를 찾기위해,examtation테이블과 LEFT JOIN수행 

방법 I

SELECT s.student_id
      ,s.student_name
      ,sub.subject_name
      ,COUNT(e.student_id) AS attended_exams 
FROM Students AS s
CROSS JOIN Subjects AS sub
LEFT JOIN Examinations AS 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, sub.subject_name

방법 II

SUBQUERYCOALESCE 이용하기

SELECT s.student_id
      , s.student_name
      , sub.subject_name
      , COALESCE(e.attended_exams, 0) AS attended_exams
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
    ) AS e 
ON s.student_id = e.student_id 
AND sub.subject_name = e.subject_name
ORDER BY s.student_id, sub.subject_name;

기억하기

-- COALESCE 함수는 입력 값이 'NULL'인경우 ' '로 대체하는 역할을 한다. 

IFNULL(e.attended_exams, 0) AS attended_exams

=COALESCE(e.attended_exams,0) AS attended_exams 
/* CROSS 조인
한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인시키는 기능
상호 조인 결과의 전체 행 개수는 두 테이블의 각 행의 개수를 곱한 수
카티션 곱(CARTESIAN PRODUCT)이라고도 한다. 
*/

SELECT *
FROM <첫 번째 테이블>
    CROSS JOIN <두 번째 테이블>

0개의 댓글