DA Study/TIL

[TIL] SELECT절에서 서브쿼리 활용하여 비율 구하기 # MySQL # SQL

harrym8n 2025. 2. 4. 11:12

Programmers Lv5 - 상품을 구매한 회원 비율 구하기
👉 문제 바로가기(Programmers)

-- 2021년에 가입한 전체 회원들 중 상품을 구매한 회원수와 상품을 구매한 회원의 비율(=2021년에 가입한 회원 중 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 수)을 년, 월 별로 출력

SELECT 
    YEAR(t2.SALES_DATE) as YEAR,
    MONTH(t2.SALES_DATE) as MONTH,
    COUNT(DISTINCT t2.USER_ID) as PURCHASED_USERS,
    ROUND(COUNT(DISTINCT t2.USER_ID) / 
          (SELECT COUNT(DISTINCT USER_ID) FROM USER_INFO WHERE JOINED LIKE '2021-%'),1) as PURCHASED_RATIO
FROM
    USER_INFO t1,
    ONLINE_SALE t2
WHERE
    t1.USER_ID = t2.USER_ID AND
    t1.JOINED LIKE '2021-%'
GROUP BY
    YEAR(t2.SALES_DATE),
    MONTH(t2.SALES_DATE)
ORDER BY
    YEAR,
    MONTH

[문제 상황]

  • 본 쿼리 SELECT절에서 비율을 계산해야 하는데, 분모인 2021년 가입한 총 회원수는 본 쿼리에서 바로 구할 수 없다.
  • 본 쿼리 COUNT 함수에 *을 넣어 전체 행 개수를 세니까 원하는 값이 출력되지 않았다.

[해결]

  • SELECT 절에 2021년 가입한 총 회원수를 구하는 서브쿼리를 사용하여 비율을 계산한다.
  • USER_INFO, ONLINE_SALE 테이블을 USER_ID로 Inner Join하였기 때문에, ONLINE_SALE 테이블의 영향으로 USER_ID에 중복값이 생겨서 COUNT함수의 *를 넣으면 원하는 값이 출력되지 않았다. (=구매수로 집계됨)
  • 따라서 USER_ID앞에 DISTINCT를 작성하여 중복값을 삭제한 후 COUNT를 해주면 원하는 값, 즉 구매수가 아닌 회원수가 도출된다.

[회고]

  • 파이썬으로 이런 로직의 코드를 작성할 때는 변수를 활용할 것 같다.
  • SQL에서도 변수 지정이 가능하나, 프로시저 단계(테이블 생성, 호출, 수정, 삭제)에서 가능하다.
  • 서브쿼리를 통해 하나의 값을 출력하여 변수처럼 활용할 수 있다.