문제
코딩테스트 연습 - 재구매가 일어난 상품과 회원 리스트 구하기 | 프로그래머스 스쿨
프로그래머스
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로 처리하고 아니면 넘기는 식으로 구현이 가능합니다.
'DB > SQL' 카테고리의 다른 글
[SQL]가격이 제일 비싼 식품의 정보 출력하기 - SQL 고득점 Kit (0) | 2025.02.13 |
---|---|
[SQL]특정 세대의 대장균 찾기 - SQL 고득점 Kit (0) | 2025.02.12 |
[SQL]서울에 위치한 식당 목록 출력하기 - SQL 고득점 Kit (0) | 2025.02.12 |
[SQL]3월에 태어난 여성 회원 목록 출력하기 - SQL 고득점 Kit (0) | 2025.02.11 |
[SQL]평균 일일 대여 요금 구하기 - SQL 고득점 Kit (0) | 2025.02.11 |