https://leetcode.com/problems/students-and-examinations/description/?envType=study-plan-v2&envId=top-sql-50
문제 설명
각 학생이 과목별로 시험에 참여한 학생의 수(attend_exams)를 구하여 모든 학생과 모든 과목을 출력해라.
최종 쿼리
select s.student_id,s.student_name,sj.subject_name,
count(e.subject_name) as attended_exams
from students as s
join subjects as sj
left join examinations as e on s.student_id = e.student_id
and sj.subject_name=e.subject_name
group by s.student_id,sj.subject_name
order by s.student_id,sj.subject_name
*cross join 의미*
- 두 테이블 간에 조건 없이 모든 가능한 조합을 반환(카티전 프로덕트와 같은 의미)
쿼리 설명 +느낀 점
문제를 보고 처음 했던 쿼리는 inner join으로 subjects 테이블과 students 테이블을 결합하고 left join으로 examinations 테이블을 결합하여 학생 수를 구하면 답이 나올 줄 알았는데 이렇게 하면 학생이 시험에 참여하지 않은 과목은 출력이 되지 않아 모든 과목이 출력되지 않는다.
모든 학생과 모든 과목이 출력되기 위해서는 students 테이블과 subjects 테이블을 cross join한 후 examinations 테이블과 left join한 후 group by로 student별 subject별로 그룹화해 주어 학생이 시험에 참여하지 않은 과목도 출력이 가능하게 된다.
문제를 보고 집계를 해야 하는데 0이 나오고 모든 컬럼을 출력해야 한다면 left join과 cross join을 활용하면 된다는 것을 알게 되었다.
'sql' 카테고리의 다른 글
[Leetcode/SQL] 197.Rising Temperature (0) | 2024.08.19 |
---|---|
[프로그래머스 SQL]LV.4 식품분류별 가장 비싼 식품의 정보 조회하기 (1) | 2024.07.25 |