프로그래밍 언어/MySQL

서브 쿼리로 데이터 끼워 넣기

코딩 악귀 2024. 2. 11. 14:10

문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

상품을 구매한 회원비율 구하기 문제.

 


 

재정의

주어지는 테이블은 다음과 같다.

  • User의 회원가입 정보
  • 물건 판매 로그

 

위 로그를 활용해서, 2021년 가입한 사람들 중에 몇 %가 구입을 했는지 구하는 문제.

 

결과는 다음처럼 나와야 한다.

 

2021년 가입자의 총 인원을 구한다.

2021년 가입자이며, 물건을 구매한 총 인원을 구한다.

위의 두개를 백분율로 표현하면 되는 문제이다.

 

한 쿼리에 복잡한 연산을 넣으면 머리가 아프다.

한 쿼리는 한 결과만을 뽑고, 이들을 조합하는 것이 마음이 편하다.

 

두 가지의 값을 구해야 하므로, 쿼리가 2개가 필요하다.

그럼 보다 단순한 쿼리를 서브 쿼리로 활용하여 계산용으로 사용한다.

 


 

풀이

 

상대적으로 단순한 2021년 가입자의 총 인원을 다음의 서브 쿼리로 획득한다.

SELECT COUNT(*)
FROM USER_INFO
WHERE YEAR(JOINED) = 2021

 

그리고, 2021년 가입자 중에 물건을 구매한 사람들의 목록을 쿼리로 구한다.

 

SELECT
    YEAR(SALES_DATE) AS YEAR,
    MONTH(SALES_DATE) AS MONTH,
    COUNT(DISTINCT(a.USER_ID)) AS PUCHAED_USERS,
    ROUND(
        COUNT(DISTINCT(a.USER_ID)) /
        (
            SELECT COUNT(*)
            FROM USER_INFO
            WHERE YEAR(JOINED) = 2021
        ), 1) AS PUCHASED_RATIO

FROM
    ONLINE_SALE AS a
JOIN
    USER_INFO AS b
ON
    a.USER_ID = b.USER_ID

WHERE
    YEAR(JOINED) = 2021

GROUP BY
    YEAR(SALES_DATE), MONTH(SALES_DATE)

ORDER BY
    YEAR(SALES_DATE), MONTH(SALES_DATE)

 

서브 쿼리를 활용하여 쉽게 풀 수 있는 문제이다.

조심해야할 점은, 구매 로그는 중복 USER가 존재할 수 있기 때문에, DISTINCT 처리를 해 주었다.

 


 

피드백

하나의 결로 풀 수 없는 문제는 서브쿼리를 어떻게 분리할까로

유도하는 습관이 중요하다.