1) 웹개발, 앱개발 종합반의 week 별 체크인 수를 세어보기
활용할 테이블을 먼저 찾아보자.
select *
from courses c
select *
from checkins ch
이 두 테이블이면 되겠다.
courses에 checkins 테이블을 붙이고, key는 course_id가 되면 좋겠다.
select *
from courses c
inner join checkins ch
on c.course_id = ch.course_id
group by로 웹개발, 앱개발을 묶어 줘야겠다.
select *
from courses c
inner join checkins ch
on c.course_id = ch.course_id
group by c.title
더 나아가서, week별로 묶어주는 것도 필요할 것 같다. 두 가지 항목을 group by로 묶어줄 땐, 콤마(,)를 사용하자.
select *
from courses c
inner join checkins ch
on c.course_id = ch.course_id
group by c.title, ch.week
이제 수를 세어야하니 count를 활용해주고, select을 활용해서 보기 좋게 수정하자.
select c.title, ch.week, count(*) as cnt
from courses c
inner join checkins ch
on c.course_id = ch.course_id
group by c.title, ch.week
별칭도 달아 주었다.
order by로 보기 좋게 오름차순으로 정렬해주면 더 좋을 것 같다. 여기서도 앱개발/웹개발 그리고 week가 연관성있게 정렬되어 있는게 좋으니, 콤마를 이용해서 함께 정렬해주자.
select c.title, ch.week, count(*) as cnt
from courses c
inner join checkins ch
on c.course_id = ch.course_id
group by c.title, ch.week
order by c.title, ch.week
참고로 order by에서 ch.week에만 내림차순을 입힐 수 있다.
select c.title, ch.week, count(*) as cnt
from courses c
inner join checkins ch
on c.course_id = ch.course_id
group by c.title, ch.week
order by c.title, ch.week desc
2) 위에 연습한 “웹개발, 앱개발 종합반의 week 별 체크인 수를 세어보기”에서 추가로 8월 1일 이후에 구매한 고객들만 보기
위의 과정에서 살펴봤던 테이블은 courses 그리고 checkins 였다. 여기에 추가로 구매관련 테이블이 필요하겠다.
select *
from orders
즉, orders 테이블을 한번 더 checkins 테이블에 붙여주어야 한다. 그리고 8월 1일 이후에 구매한 주문만으로 추려줘야 한다.
일단 한번 더 inner join으로 붙여보자. chekcins와 orders 테이블에 user_id가 있기에, 이를 통해서 붙여줬다.
select *
from courses c
inner join checkins ch
on c.course_id = ch.course_id
inner join orders o
on ch.course_id = o.course_id
이제.. orders 테이블에서 8월 1일 이후에 구매한 고객만 추려야 하니, 이는 created_at이 그 시점 이후여야 하겠다.
(여기서 created_at은 orders 테이블에 있는 필드다)
select *
from courses c
inner join checkins ch
on c.course_id = ch.course_id
inner join orders o
on ch.user_id = o.user_id
where o.created_at >= '2020-08-01 00:00:00'
기존과 동일하게 묶어주고 세어주자. 보기 편하게 정렬과 별칭도 잊지 말고!
select c.title, ch.week, count(*) as cnt
from courses c
inner join checkins ch
on c.course_id = ch.course_id
inner join orders o
on ch.user_id = o.user_id
where o.created_at >= '2020-08-01 00:00:00'
group by c.title, ch.week
order by c.title, ch.week
여기 잠깐 짚고 넘어가야 할 것이 있다. SQL에는 같은 결과에 도달하는 방법이 여러가지다.
그래서 반드시 지금 쓴 쿼리만이 정답이 아니다. 이를 명심하자.
추가로, 이렇게 해봤다가 저렇게 해봤다가 콤마도 넣어보고 오류를 겪어보고 경험을 해보면서 결과를 도출해내는 것이니 천천히 접근해보자!
'SQL' 카테고리의 다른 글
본격 쿼리 직접 작성해보기 (feat. inner join) (0) | 2022.05.24 |
---|---|
Join 연습해보기 2 (feat. Inner Join) (0) | 2022.05.23 |
Join 연습해보기 (feat. Inner Join) (0) | 2022.05.23 |
Join (Left Join / Inner Join) (0) | 2022.05.22 |
Join을 왜 배우고 왜 써야하는가? (0) | 2022.05.22 |