출처
문제
각 학생이 각 시험에 참석한 횟수를 찾는 솔루션을 작성합니다.
student_id및 subject_name로 정렬된 결과 테이블을 반환합니다.
문제에 대한 해석
풀이(MYSQL)
-- 1.학생, 과목 테이블 만들기
with base as (
select *
from Students, Subjects
),
-- 2. 학생, 과목별 시험의 수 집계
test as (
select student_id,subject_name, count(*) as'attended_exams'
from Examinations
group by student_id,subject_name
)
-- 1과 2 합치기
select base.student_id,base.student_name,base.subject_name, ifnull(test.attended_exams,0) as 'attended_exams'
from base left join test
on base.student_id = test.student_id
and base.subject_name = test.subject_name
order by base.student_id, base.subject_name
1번 학생, 시험과목 테이블 | 2번 test테이블 |
1번+ 2번 = 3번 | 3번, ifnull 없을 경우 |
각각의 테이블을 만들어 큰 테이블을 기준으로 조인하는데
이때 값이 없으면 null로 처리되므로 ifnull함수를 사용해 줘야 한다
다른사람 풀이
SELECT
Students.student_id,
Students.student_name,
Subjects.subject_name,
COUNT(Examinations.subject_name) as attended_exams -- 3. 학생, 과목별 집계
-- 1.학생, 시험과목 테이블 만들기
FROM Students
CROSS JOIN Subjects
-- 2. 학생, 시험과목 테이블을 기준으로 Examinations 조인
LEFT JOIN Examinations
ON Students.student_id=Examinations.student_id
AND Examinations.subject_name=Subjects.subject_name
GROUP BY Students.student_id, Students.student_name, Subjects.subject_name
ORDER BY Students.student_id, Subjects.subject_name;
1번 학생, 시험과목 테이블 | 2. examinations테이블 조인 | 3. 집계처리 |
'문제풀이 > SQL(My sql)' 카테고리의 다른 글
[문제풀이] Leet code - Average Selling Price (4) | 2024.07.23 |
---|---|
[문제풀이] Leet code - Monthly Transactions I (1) | 2024.07.23 |
[문제풀이] Leet code - Managers with at Least 5 Direct Reports (0) | 2024.07.22 |
[문제풀이] Leet code - Employee Bonus (0) | 2024.07.19 |
[문제풀이] Leet code - Investments in 2016 (0) | 2024.07.19 |