알고리즘 문제 풀이/SQL
[SQL]재구매가 일어난 상품과 회원 리스트 구하기 - SQL 고득점 Kit
나맘임
2025. 2. 13. 13:20
문제
코딩테스트 연습 - 재구매가 일어난 상품과 회원 리스트 구하기 | 프로그래머스 스쿨
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
풀이
SELECT
USER_ID,
PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*) > 1
ORDER BY USER_ID ASC, PRODUCT_ID DESC;
이 문제에선 가장 중요한 건 HAVING 과 COUNT(*)입니다.
HAVING이란?
그룹핑 후 그룹 결과에서 조건에 따라 필터링
그러면 WHERE이랑 차이점이 뭘까요?
WHERE 은 그룹핑을 하기 전에 조건에 따라 먼저 필터링을 합니다.
그렇기에 WHERE은 SUM, AVG 같은 함수를 사용할 순 없지만 HAVING은 가능합니다.
행의 개수가 여러 개인지 파악하기 위해선 COUNT를 써야하지만 WHERE절엔 사용할 수 없습니다.
하지만 HAVING으로 처리할 수 있습니다.
COUNT(*)의 의미
- 테이블의 모든 열을 포함한 행의 개수를 셉니다.
- 특정 열에 NULL이 있어도 상관없이 행의 개수를 반환합니다.
이 문제와 상관은 없으나 NULL을 센다는 것을 유의있게 봐야합니다.
만약 NULL을 빼고 세고 싶다면 WHERE절로 필터링하거나 다음과 같이 시도해도 됩니다.
SELECT COUNT(CASE WHEN EMPLOYEE_ID IS NOT NULL THEN 1 END) AS NON_NULL_COUNT
FROM EMPLOYEES;
CASE WHEN을 사용해서 NULL이 아닐 때만 1로 처리하고 아니면 넘기는 식으로 구현이 가능합니다.