관리 메뉴

블로그

[Programmers] 131534 - 상품을 구매한 회원 비율 구하기 SQL MySQL 본문

공부

[Programmers] 131534 - 상품을 구매한 회원 비율 구하기 SQL MySQL

beenu 2024. 10. 31. 21:49
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/131534

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

# 첫 시도

# 21년에 가입한 회원 추출
# 상품 구매한 회원 수와 상품 구매 회원 비율을 년, 월 별로 출력
# 상품 구매 회원 비율은 소수점 두 번째 자리에서 반올림
# 전체 결과는 년 기준 오름차순, 월 기준 오름차순

SELECT YEAR(SALES_DATE) AS YEAR, MONTH(SALES_DATE) AS MONTH, COUNT(U.USER_ID) AS PURCHASED_USERS, ROUND(PURCHASED_USERS/JOINED_2021, 2) AS PURCHASED_RATIO
FROM (SELECT *, COUNT(*) AS JOINED_2021
      FROM USER_INFO
      WHERE JOINED LIKE '2021%') U
JOIN ONLINE_SALE O
ON U.USER_ID = O.USER_ID
GROUP BY SALES_DATE;

 

하면서 뭔가 잘못된 걸 느꼈는데 뭔지 모르겠어서 블로그 참고함 

 

  • 구매 이력 여러 개 있는 회원은 id 중복되는 점 -> distinct 사용해서 중복 id 제거해야 함
  • 총 회원 수를 어느 부분에서 구해야 하는지 몰랐음 

 

# 블로그 참고 코드

SELECT DATE_FORMAT(O.SALES_DATE, '%Y') AS YEAR,
       DATE_FORMAT(O.SALES_DATE, '%m') AS MONTH,
       COUNT(DISTINCT U.USER_ID) AS PUCHASED_USERS,
       ROUND(COUNT(DISTINCT U.USER_ID)/(SELECT COUNT(*) FROM USER_INFO WHERE joined LIKE '2021%'), 1) AS PUCHASED_RATIO
FROM USER_INFO U
JOIN ONLINE_SALE O
ON U.USER_ID = O.USER_ID
WHERE U.JOINED LIKE '2021%'
GROUP BY YEAR, MONTH
ORDER BY YEAR, MONTH ;

 

SELECT 절에서 2021년에 가입한 전체 회원 수를 가져오는 서브쿼리를 쓰는 방법이 있다는 것을 배웠음 ..

 


 

# 지피티 코드

SELECT DATE_FORMAT(O.SALES_DATE, '%Y') AS YEAR,
       DATE_FORMAT(O.SALES_DATE, '%m') AS MONTH,
       COUNT(DISTINCT U.USER_ID) AS PURCHASED_USERS,
       ROUND(COUNT(DISTINCT U.USER_ID) / total_users.total_user_count, 1) AS PURCHASED_RATIO
FROM USER_INFO U
JOIN ONLINE_SALE O ON U.USER_ID = O.USER_ID
CROSS JOIN (
    SELECT COUNT(*) AS total_user_count
    FROM USER_INFO
    WHERE JOINED LIKE '2021%'
) total_users
WHERE U.JOINED LIKE '2021%'
GROUP BY YEAR, MONTH
ORDER BY YEAR, MONTH;

 

지피티한테 성능 개선 시켜달라고 하고 코드 받음 ^.^

서브 쿼리가 성능 저하의 원인이 될 수 있어서 JOIN과 추가 계산 필드로 대체하라고 함 

서브쿼리 부분을 CROSS JOIN으로 바꿔버림 

 

블로그 참고 쿼리 수행시간
지피티 코드 쿼리 수행시간

 

수행 시간 비교해보니까 거의 비슷한데 블로그 참고 코드는 대체로 0.00016 정도고 지피티는 대체로 0.00017 이넴

코테 풀 때는 서브쿼리 사용해도 괜찮을 것 같다

 

>> 쿼리 수행시간 보는 방법

SELECT @@profiling;
SET profiling=1; # select 했을 때 0이면 1로 설정해서 profiling 활성화 시켜주기

# 실행할 코드

SHOW profiles;

 

 

>> 참고 블로그

https://jaehwaseo.tistory.com/8

 

프로그래머스 상품을 구매한 회원 비율 구하기 SQL(MySQL)

문제 다음은 어느 의류 쇼핑몰에 가입한 회원 정보를 담은 USER_INFO 테이블과 온라인 상품 판매 정보를 담은 ONLINE_SALE 테이블입니다. USER_INFO 테이블은 아래와 같은 구조로 되어있으며 USER_ID, GENDER,

jaehwaseo.tistory.com

 

728x90
반응형