프로그래머스 문제
https://school.programmers.co.kr/learn/courses/30/lessons/131534#qna
풀이
https://school.programmers.co.kr/questions/74261
-- 풀이 쿼리
-- 2021년 가입 회원 중 구매기록이 있는 회원 수와
-- 2021년에 가입한 전체 회원 중 해당 회원들(=2021년 가입 회원 구매기록이 있는 회원들)의 비율을
-- 년, 월별로 출력.
-- 비율은 소수점 첫째자리까지만
-- 전체 결과는 연 기준 오름차순, 월 기준 오름차순 정렬
WITH N AS (
SELECT COUNT(DISTINCT USER_ID) AS N_CUSTOMERS
FROM USER_INFO
WHERE YEAR(JOINED) = '2021'
)
SELECT YEAR(O.SALES_DATE) AS YEAR
, MONTH(O.SALES_DATE) AS MONTH
, COUNT(DISTINCT CASE WHEN YEAR(U.JOINED) = '2021' THEN O.USER_ID ELSE NULL END) AS PUCHASED_USERS
, ROUND(COUNT(DISTINCT CASE WHEN YEAR(U.JOINED) = '2021' THEN O.USER_ID ELSE NULL END)
/ (SELECT N_CUSTOMERS FROM N), 1) AS PUCHASED_RATIO
FROM ONLINE_SALE O
LEFT JOIN USER_INFO U
ON O.USER_ID = U.USER_ID
GROUP BY YEAR, MONTH
ORDER BY YEAR, MONTH
쿼리를 풀이해보면 이렇다.
1. WITH문 : 가입 연도가 2021년인 회원 수 셈(물론 WITH문으로 안 빼도 되긴 했음)
2. COUNT(DISTINCT CASE WHEN ...) : 가입 연도가 2021년인 회원 중 구매기록이 있는 회원 수 셈
3. ROUND( ... ... ... ) : 문제에서 요구하는 비율 계산
그 외에는 정렬 조건을 맞춰주면 된다.
뭔가 더 다른 효율적인 방법이 있을까?
아예 WITH문을 2021년에 가입한 회원들의 정보를 담은 CTE문으로 만들었다면 좀 더 간단한 쿼리가 되었을 것 같다.
'코딩테스트 > SQL - 프로그래머스' 카테고리의 다른 글
우유와 요거트가 담긴 장바구니 (0) | 2024.03.30 |
---|---|
특정 조건을 만족하는 물고기별 수와 최대 길이 구하기 (0) | 2024.03.23 |
SQL 고득점 kit(JOIN) - 5월 식품들의 총매출 조회하기 (0) | 2024.03.20 |
SQL 고득점 kit(JOIN) - 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (2) | 2024.03.14 |
SQL 고득점 kit(GROUP BY) - 노선별 평균 역 사이 거리 조회하기 (0) | 2024.03.04 |