신이 되고 싶은 갓지이

SQL 코테 연습 프로그래머스 Lv.4 문제풀이 5 본문

SQL

SQL 코테 연습 프로그래머스 Lv.4 문제풀이 5

갓지이 2025. 2. 18. 12:13

1. 년, 월, 성별 별 상품 구매 회원 수 구하기(GROUP BY) 정답률 : 74%

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

문제

USER_INFO 테이블과 ONLINE_SALE 테이블에서 년, 월, 성별 별로 상품을 구매한 회원수를 집계하는 SQL문을 작성해주세요. 결과는 년, 월, 성별을 기준으로 오름차순 정렬해주세요. 이때, 성별 정보가 없는 경우 결과에서 제외해주세요.

 

일단 조건에 맞게 테이블을 세팅하기 위해 두 테이블을 join 하고 구매일에서 연과 월만 추출했다. join을 하고나서 테이블을 확인하니 한 연월에 2번 이상 구매한 고객이 있기 때문에 서브쿼리를 통해 중복을 제거할까 고민했지만 좀 더 간결한 코드를 위해 count(distinct ~)로 중복 없이 counting했다. 

-- count(distinct )로 중복없이 계산
SELECT YEAR(SALES_DATE) YEAR, MONTH(SALES_DATE) MONTH
    , GENDER, COUNT(DISTINCT U.USER_ID) USERS
FROM USER_INFO U
INNER JOIN ONLINE_SALE S
    ON U.USER_ID=S.USER_ID 
WHERE GENDER IS NOT NULL
GROUP BY 1,2,3
ORDER BY 1,2,3

 

 

2. 특정 세대의 대장균 찾기(SELECT) 정답률 : 57%

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

문제

3세대의 대장균의 ID(ID) 를 출력하는 SQL 문을 작성해주세요. 이때 결과는 대장균의 ID 에 대해 오름차순 정렬해주세요.

 

이 문제는 self-join 문제라고 볼 수 있다. 3세대를 TH, 2세대를 TW, 1세대를 O라고 했을 때, 1세대는 부모가 없기 때문에 where절에 해당 조건을 작성하고, '1세대의 ID = 2세대의 PARENT_ID' & '2세대의 ID = 3세대의 PARENT_ID' 로 self-join을 진행했다. 

-- SELF-JOIN
SELECT TH.ID
-- , TH.PARENT_ID, TW.ID, TW.PARENT_ID, O.ID, O.PARENT_ID
FROM ECOLI_DATA TH
LEFT JOIN ECOLI_DATA TW
    ON TH.PARENT_ID=TW.ID
LEFT JOIN ECOLI_DATA O
    ON TW.PARENT_ID=O.ID
WHERE O.PARENT_ID IS NULL AND TW.PARENT_ID IS NOT NULL
ORDER BY 1