카테고리 없음
스파르타코딩 데이터분석 04-24
박지강(Data_2기)
2024. 4. 24. 11:08
[2기] 데이터와 친해지는 SQL 3회차 과제
문제1*
case when 구문과 join 함수를 사용하여, users 테이블을 기준으로, 결제를 한 유저와 결제를 하지 않은 유저를 추출해주세요.결과값은 아래와 같아야 합니다.
select case when p.game_account_id is null then '결제안함'
else '결제함'
end gb,
count(distinct u.game_account_id) usercnt
from users u
left join payment P on u.game_account_id = p.game_account_id
group by 1
CASE WHEN구문으로 NULL값인지 아닌지를 판단하여 결제여부 확인
한 명의 유저가 결제를 여러번 할 수도 있기 때문에 전체 유저 데이터가 들어있는 USER 테이블에서 중복처리한 유저 수 계산
첫번째 컬럼을 기준으로 GROUP BY
- **문제2**
- 서버번호가 2 이상인 데이터와 결제방식이 CARD 인 경우를 join해 주시고
- game_account_id 를 기준으로 game_actor_id 갯수를 중복값없이 세어주시고, actorcnt 으로 컬럼명을 명시해주세요.
- pay_amount 값을 더해주시고, sumamount 으로 컬럼명을 명시해주세요.
- having 을 사용하지 않고, subquery 사용으로 game_actor_id 갯수가 2 이상인 경우만 추출해주세요. 결과값은 아래와 같아야 합니다. (전체결과 중 일부입니다.)
select *
from (select u.game_account_id,
count(distinct u.game_actor_id) actorcnt,
sum(distinct p.pay_amount) sumamount
from (select *
from users
where serverno >= 2
) u
join (select *
from payment
where pay_type = 'CARD'
) p
on u.game_account_id = p.game_account_id
group by u.game_account_id) c
where c.actorcnt >= 2
각각의 테이블에 조건문을 붙이고 서로 조인
계정 아이디 별로 게임 캐릭터 아이디 수와 결제금액 합산 출력
로그에 따라 기록된 테이블이 때문에 하나의 캐릭터가 중복되어 세질 수 있다. 따라서 distinct 처리
결제 금액을 합산할 때는 각각의 game_account_id에 해당하는 결제 금액을 중복으로 더하지 않기 위해 중복을 제거
**문제3**
- user 테이블에서 game_account_id, date, serverno 를 추출한 데이터와 매출 테이블에서 game_account_id 별 가장 마지막 결제일자를 찾고 join 을 진행해주세요.
- 그 다음, datediff 함수를 사용해 결제일자-접속일자를 구해주세요. 그리고 컬럼이름을 diffdate로 설정해주세요. 두 날짜의 형식은 같아야 합니다.
- 마지막으로, 인라인 뷰 subquery 를 이용하여 서버별 평균 diffdate를 구해주세요. 다만, 평균 datediff 컬럼은 정수 형태로 출력되어야 합니다. 또한, 조건절에 diffdate 값이 10일 이상인 경우를 필터링해주세요. 그리고 서버번호를 기준으로 내림차순 정렬해주세요. (전체결과 중 일부입니다.)
select c.serverno, round(avg(c.datediff))
from(select p.payday, u.date, datediff(p.payday, u.date) datediff, u.serverno
from (select game_account_id , `date` , serverno
from users
) u
join(select game_account_id, substr(max(approved_at),1,10) payday
from payment
group by game_account_id
) p
on u.game_account_id = p.game_account_id
) c
where c.datediff >= 10
group by c.serverno
order by c.serverno desc
가장 최근의 결제일자를 찾기 위해선 max사용
서버번호를 출력하기 위해 인라인 서브쿼리의 select문에 serverno 출력