나의 풀이)
with A as (
select a.user_id,
b.action,
case when b.action = 'confirmed' then 1
else 0 end as num
from Signups a left join Confirmations b on a.user_id = b.user_id)
select user_id, sum(num)/count(*) as 'confirmation_rate'
from A
group by user_id
Signups에만 존재하는 user_id가 있었기 때문에 left join을 해주었다.
case when문을 사용하여 confirmed 인 경우에 1 아닌 경우 0을 주어
본 쿼리에서 sum()을 사용해 확정된 갯수를 구해주었다.
튜터님의 코드)
-- #로그인 시도횟수
-- with sub1 as (
-- select
-- user_id,
-- count(*) as trials,
-- count(case when action = 'timeout' then 1 end) as timeout,
-- count(case when action = 'confirmed' then 1 end) as confirmed
-- from Confirmations
-- group by 1)
-- #회원인데 로그인시도를 한번도 안한사람을 null로 처리 ----> 조인시 고려사항 두 가지(left/cross/inner, on조건)
-- select
-- a.user_id,
-- case
-- when b.user_id is null then 0.00
-- else round(b.confirmed/b.trials, 2) end as confirmation_rate
-- from Signups as a
-- left join sub1 as b on a.user_id = b.user_id
배운점)
특정조건이 달린 경우 case when문
특정 조건이 둘 중 하나인 경우 if문 사용
'TIL > SQL' 카테고리의 다른 글
리트코드| average selling prices (0) | 2024.09.05 |
---|---|
리트코드| Students and Examinations (My SQL) (0) | 2024.09.03 |
리트코드| 온도 상승(MySQL) (0) | 2024.08.22 |
프로그래머스| 상품을 구매한 회원 비율 구하기 (0) | 2024.08.14 |
프로그래머스| 자동차 대여 기록 별 대여 금액 구하기(MySQL) (0) | 2024.08.09 |