[sql][스파르타] 서브쿼리 연습문제 풀이

Regina·2022년 10월 29일
0

SQL

목록 보기
9/9

subquery 에서 from 절에 서브쿼리를 넣는 예제 문제였는데,, 나중에 다시 한번 더 풀어봐야 할 것 같다. 오답노트.

잘못된 풀이. 마지막에 courses 테이블에서 과목명인 title을 가져오기 위해서 join을 해야하는데 그 기준을 뭐로 해야 하는지가 어려웠다. 기존에 작성해서 만들어둔 전체를 괄호로 감싸서 별칭을 만들고 가져오려고 했는데.. 뭔가 잘못되었다.

select c.title, cnt_checkins, cnt_total, cnt_checkins/cnt_total from
	(select cnt_checkins, cnt_total, cnt_checkins/cnt_total from
		(select course_id, count(distinct(user_id)) as cnt_checkins from checkins
		group by course_id) a
	inner join	
		(select course_id, count(user_id) as cnt_total from orders o  
		group by course_id) b
	on a.course_id = b.course_id) aa
inner join courses c on aa.course_id = c.course_id

오류명은

SQL Error [1054] [42S22]: Unknown column 'aa.course_id' in 'on clause'

내가 뭔가 잘못 잘성할 때마다, unkown column 이라는 메시지가 자주 뜬다...

제대로된 풀이는 아래와 같다.

select c.title,
a.cnt_checkins,
b.cnt_total,
(a.cnt_checkins/b.cnt_total) as ratio
from
(
select course_id, count(distinct(user_id)) as cnt_checkins from checkins
group by course_id
) a
inner join
(
select course_id, count(*) as cnt_total from orders
group by course_id 
) b on a.course_id = b.course_id
inner join courses c on a.course_id = c.course_id

inner join 할 때 기준을 a로 하면 되는 거였다. a에도 기준으로 삼을 수 있는, 즉, course 테이블에도 있고, a에도 있는 course_id가 있기 때문에 course_id를 기준으로 테이블 2개가 조인될 수 있다.

join, 서브쿼리(특히 from절에서 쓰일때)를 연습 많이 해야 될 것 같다.

연습문제는
1) course_id별 유저의 체크인 개수 구하기
2) course_id별 인원 구하기
1)과 2)를 합친다음에 더 나가가서 (course_id별 checkin 개수에 전체 인원을 붙이기. 왜냐 그냥 코스 아이디별로 다짐 수만 보고, 아 course_id가 xxx인 수업의 다짐수가 많네. 이 수업을 수강하는 학생들이 열심히 듣나보다 하면 안됨. 왜냐면 수업을 수강하는 전체 수강생 수의 차이가 날 수 있기 때문. 예를 들어, a 과목의 수강생을 5명이고, b 과목의 수강생은 100명이고, a 과목에서 오늘의 다짐을 작성한 학생은 5명, b 과목에서 오늘의 다짐을 작성한 학생은 10명일 때, a 과목의 수강생은 100% 가 열심히 수강하고 있다는 것을 알 수 있다.)

<-이 설명을 들으면서, 데이터를 해석하는 능력을 키워야 겠다는 생각을 했다. 데이터는 많고 숫자는 많고 뽑을 수 있는 자료는 많지만, 어떤 것을 뽑아야 하는지, 뽑아낸 정보를 어떻게 이해해야 하는지는 코딩 실력, sql 쿼리문을 얼마나 잘 작성하는지랑은 다른 이야기이다. 책도 다양하게 읽고, 뉴스도 보고, 세상 사람들이 어떻게 살고 있는지, 어떤 생각들을 하고 있는지 들여보면서 사람들을 이해하려고 노력해야 데이터에 담긴 사람들의 행동, 생각들을 조금이나마 더 찾아낼 수 있다고 생각한다.

3) 퍼센트 붙이기
4) course_id 대신 과목명을 보여주기
결과는 아래와 같이 나와야 함.

코스제목별 개수, 전체, 비율

추가로, 맨날 자꾸 까먹는것.
잘못 tab을 했을 때 다시 내어쓰기 하는 것은 shift+tab 임!

profile
하루하루 더 나은 사람이 되어보자

0개의 댓글