
강의에서 설명해주신 정답쿼리는 20)에서는 서브쿼리를 활용한 방법, 21)은 sum과 count를 활용하는 간단한 방법인데요.
20)
with table1 as (
select enrolled_id, count(*) as done_cnt from enrolleds_detail
where done = 1
group by enrolled_id
), table2 as (
select enrolled_id, count(*) as total_cnt from enrolleds_detail
group by enrolled_id
)
select a.enrolled_id,
a.done_cnt,
b.total_cnt,
round(a.done_cnt/b.total_cnt,2) as ratio
from table1 a
inner join table2 b on a.enrolled_id = b.enrolled_id
21)
select enrolled_id,
sum(done) as cnt_done,
count(*) as cnt_total
from enrolleds_detail ed
group by enrolled_id
(강의안의 코드스니펫을 그대로 첨부했습니다.)
20)의 정답쿼리에서 사용한 table1의 서브쿼리는 where절에서 done의 필드값이 1인 데이터만 카운트하기 때문에, 모든 강의를 한 번도 수강하지 않아서 sum(done) = 0인 enrolled_id는 출력 결과에 포함하지 않게 되는 것 같습니다. sum(done) = 0인 enrolled_id가 49개 존재해서, 20)의 정답쿼리는 275개, 21)의 정답쿼리는 324개로 데이터 개수에서 차이가 나구요.
그런데 강의에서는 20)과 21)의 쿼리문이 같은 방법이고, 21)의 쿼리문처럼 간단하게 작성할 수 있다, 하고 설명하고 넘어가시더라구요. 진도율이 0 초과인(강의를 하나라도 다 들은) 유저만을 추출하려면 20)의 쿼리문을 사용하고, 모든 등록 유저의 진도율 현황을 살펴보려면 21)의 쿼리문이 더 적절할 것 같습니다. 두 쿼리문의 쓰임새가 다른 것으로 이해하고 넘어가면 될까요?


보고 계신 화면 전체를 캡처해 주시면, 튜터님들이 빠르게 상황을 이해할 수 있어요.
