DB/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로 처리하고 아니면 넘기는 식으로 구현이 가능합니다.