문제) 1280. Students and Examinations

  • 학생들이 각 시험을 얼마나 치뤘는지 나뉘어져 있는 테이블에서 조인하여 찾아내는 문제였습니다.
select s.student_id, s.student_name, sub.subject_name, count(e.subject_name) as attended_exams
from students s
cross join subjects sub
left join examinations e on s.student_id = e.student_id and sub.subject_name = e.subject_name
group by 1, 2, 3
order by 1, 2

세 테이블을 한 테이블로 합쳐야 한다는 생각부터 들었습니다.
inner 나 outer 를 생각하고 있었는데 students(학생) 테이블과 subjects(과목) 테이블을 조인해서 학생들에게 모든 과목을 붙혀주어야 시험을 치루지않은 과목도 보여줄 수 있다는 것을 알았습니다. 왜냐면 문제에 해당 내용이 있었습니다..ㅎ 하여 cross join으로 학생과 과목을 모두 cross 시켰고 이 곳에다가 left join으로 Examinations(시험) 테이블은 묶었습니다.
학생 한명한명 모두 전체 과목을 붙혀주고 시험을 봤는지 안봤는지 확인을 위해 시험 테이블을 그 옆에다 붙힌 것이죠!
group by를 통해서 학생 id별, 학생 이름별, 과목별 그룹화해주고 학생 id와 학생 이름으로 오름차순 정렬로 마무리 하였습니다!

문제) 1934. Confirmation Rate

  • 요청한 메세지에 대해서 컨펌을 했냐 안했냐와 요청한 메세지 대비 얼마나 컨펌했는지 비율을 찾는 문제입니다.
select s.user_id,
       round(avg(if(c.action='confirmed', 1, 0)),2) AS confirmation_rate
from signups s left join confirmations c on s.user_id=c.user_id
group by s.user_id

해당 문제는 퍼센트를 구하기 위해 처음에는 컨펌한 수와 메세지 요청 수를 집계하여 컬럼에 추가해주고 select문으로 계산만 해주면 된다고 생각했었습니다!
허나 찾아보던 와중 비율을 계산하기 위해서 위의 select문에 두번째 컬럼을 보시면 if문을 활용하여 아예 action에 컨펌인 것들은 1로 아닌 것은 0으로 두고 avg(평균)을 내는 방법이 있었습니다. 이것은 action이 두가지로 표현되어 있었기에 가능하다고 생각하나 매우 간편한 방법이라고 생각하여 오늘의 문제풀이로 가져오게 되었습니다:)
마지막에 user_id별로 그룹화 해주면 개인의 메세지 컨펌비율을 확인할 수 있습니다!

python 시각화 추가 학습내용

# matplotlib에 시각화 표현방법!
plt.tick_parms(axis='y', labelcolor='b', direction='inout')
# tick_parms는 축의 눈금을 스타일 지정할 수 있습니다! (열지정, 색상, 눈금의 안,밖 표시 등등)
profile
Data analyst를 향해 도전하는 이야기

0개의 댓글