본문 바로가기
IT/SQL

[mySQL] 종합적인 쿼리 예제 풀어보기 (JOIN, GROUP BY 등)

by 저당단 2024. 11. 6.

프로그래머스 Lv.5 "상품을 구매한 회원 비율 구하기" 문제입니다.

USER_INFO 테이블과 ONLINE_SALE 테이블에서 2021년에 가입한 전체 회원들 중 상품을 구매한 회원수와 상품을 구매한 회원의 비율(=2021년에 가입한 회원 중 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 수)을 년, 월 별로 출력하는 SQL문을 작성해주세요. 상품을 구매한 회원의 비율은 소수점 두번째자리에서 반올림하고, 전체 결과는 년을 기준으로 오름차순 정렬해주시고 년이 같다면 월을 기준으로 오름차순 정렬해주세요.

 

문제 전문은 아래 링크에서 볼 수 있습니다.

꽤 여러 개념이 포함되어 있어서 풀어볼 만한 문제라고 생각됩니다.

 

Solved-Algorithm/MySQL/프로그래머스/5/131534. 상품을 구매한 회원 비율 구하기 at main · ParkBible/S

This is an auto push repository for Baekjoon Online Judge created with [BaekjoonHub](https://github.com/BaekjoonHub/BaekjoonHub). - ParkBible/Solved-Algorithm

github.com

 

정답 판정 받은 쿼리:

SELECT 
    YEAR(s.SALES_DATE) AS YEAR , MONTH(s.SALES_DATE) AS MONTH,
    COUNT(DISTINCT s.USER_ID) AS PURCHASED_USERS,
    ROUND(COUNT(DISTINCT s.USER_ID) / (SELECT COUNT(*) FROM USER_INFO s1 WHERE YEAR(JOINED) = "2021"), 1) AS PURCHASED_RATIO
FROM 
    USER_INFO u JOIN ONLINE_SALE s ON u.USER_ID = s.USER_ID
WHERE 
    YEAR(u.JOINED) = "2021"
GROUP BY 
    YEAR(s.SALES_DATE), MONTH(s.SALES_DATE)
ORDER BY 
    YEAR, MONTH

 

알아가면 좋은 것들 (위 쿼리에 없는 내용도 포함되어 있음)

  • ROUND(실수, 표시할 소숫점 이하 자릿수) : 반올림
  • COUNT(DISTINCT 컬럼명) : 컬럼명에 해당하는 값이 중복되지 않는 로우들의 개수만 카운트
  • YEAR(컬럼명) : 연도를 문자열형으로 나타냄
  • GROUP BY에 있는 HAVING : WHERE과 달리 집계된 "결과"를 필터링함. 집계 함수 사용 가능
  • 집계 함수 종류  : COUNT, SUM, AVG, MAX, MIN
  • WHERE 컬럼명 IN (1, 2, 3) : 1, 2, 3 중 하나에 포함된다면 참
  • WHERE절 서브쿼리 : 컬럼 하나만 조회하여 IN에 넣는 경우 많음 ex) SELECT * FROM 테이블 WHERE seq IN (SELECT seq FROM 테이블2)

'IT > SQL' 카테고리의 다른 글

[PostgreSQL] pg_cron 익스텐션 환경설정  (0) 2025.12.15
[SQL] NULL 다루기  (1) 2024.10.31
[SQL] JOIN 문법  (3) 2024.10.02
[SQL] 시간 비교 - timestampdiff  (0) 2024.04.17