본문 바로가기

데이터 분석/SQL

[MYSQL] 1280. Students and Examinations / 카티션 곱(행렬 곱)/복합키 조인

꽤 머리를 앓았던 문제.

시작해보자

 

>>문제 : 테이블이 세개이다.

 

1) [Student]테이블 : 학생번호 + 학생이름

2) [Subject]테이블 : 학교에서 진행하는 모든 과목

 

3) [Examination]테이블 : 학생이름 + 시험친 과목

 

>>문제설명

각 학생이 각 과목에 응시한 시험의 횟수를 구하시오

(만약 시험에 응시하지 않았다면 0 출력)

 

>>예시

students  subjects

examination

 

>>예시 출력결과

어려웠던 점 : 응시하지 않은 시험은 0처리 (join 시 null이 되어야 하나?)

 


풀이과정

step1. 학생-과목별 응시횟수 구하기

여기서 group의 기준이 되는 값은 단순 학생 혹은 과목이 아닌

학생-과목이다.

 

따라서 학생-과목의 두 가지 기준으로 group by 를 해주었다.

(left join 해준 건 그냥 이름 추가하려고)

 

>>결과

근데 여기서 문제가 생김.

응시를 하지 않은 과목의 경우 cnt에 조회가 안됨.

 

예를 들어 bob은 Programming과 Math과목은 응시했으나

Physics 과목은 응시하지 않아 행이 없음

 

근데 답에는 안본 과목도 subject열에 있어야 하고

cnt 값도 0이 출력되어야 함.


step2. 행렬곱으로 이름 x 과목 테이블 만들기

그래서 억지로 학생 이름 x 과목의 카티션 곱 테이블이 필요함

=> 그럼 만들자

>> 결과

 


step3. 학생 -과목을 복합키로 하여 step1테이블과 join 

 

step1과 step2에 만들어진 테이블을 보자

 

step1 step2

step2에서 step1을 join 하면 된다.

그런데 구분의 기준이 되는 값이 학생-과목으로 두개이므로

복합키 조인을 해주어야 한다.

 

>>쿼리

복합키 조인 + ifnull로 없는 cnt값 0처리

 

>>결과