문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
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 처리를 해 주었다.
피드백
하나의 결로 풀 수 없는 문제는 서브쿼리를 어떻게 분리할까로
유도하는 습관이 중요하다.
'프로그래밍 언어 > MySQL' 카테고리의 다른 글
특정 단위로 테이블 만들기 (0) | 2024.02.21 |
---|---|
Where In 활용하기 (0) | 2024.02.14 |
서브 테이블로 복잡한 쿼리 풀기 (0) | 2024.02.11 |
SQL 코딩 테스트 훈련 (0) | 2024.02.08 |
MySQL SELECT 함수 모음 (0) | 2024.02.08 |
문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
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 처리를 해 주었다.
피드백
하나의 결로 풀 수 없는 문제는 서브쿼리를 어떻게 분리할까로
유도하는 습관이 중요하다.
'프로그래밍 언어 > MySQL' 카테고리의 다른 글
특정 단위로 테이블 만들기 (0) | 2024.02.21 |
---|---|
Where In 활용하기 (0) | 2024.02.14 |
서브 테이블로 복잡한 쿼리 풀기 (0) | 2024.02.11 |
SQL 코딩 테스트 훈련 (0) | 2024.02.08 |
MySQL SELECT 함수 모음 (0) | 2024.02.08 |