티스토리 뷰

Lv2. 재구매가 일어난 상품과 회원 리스트 구하기

문제

- 동일한 회원이 동일한 상품을 재구매한 데이터 구하기 → GROUP BY, HAVING COUNT(*)

 

풀이1 : GROUP BY, HAVING COUNT(*) 이용

SELECT USER_ID, PRODUCT_ID FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*) >= 2
ORDER BY USER_ID, PRODUCT_ID DESC;

- 사실 SQL 오랜만에 해서 HAVING 절에 집계함수가 들어가도 되나 긴가민가 했음ㅎ!

- 집단을 고르고 싶을 때는 HAVING 절 이용!

- COUNT(*)을 이용함! 현재 NULL 데이터가 없기 때문에 COUNT(*) 문제 없음.

* WHERE, GROUP BY, HAVING 문이 포함된 집계 명령문의 실행과정
1. FROM 문에 지정된 테이블로 부터
2. WHERE문에 지정된 조건에 해당하는 튜플들을 선택하고
3. GROUP BY 문에 따라 집단별로 구분한 후
4. HAVING문에 지정된 특성을 가지는 집단을 선별하여
5. SELECT문에서 각 집단별로 집계함수를 적용한 결과 출력

풀이2 : SELF JOIN 이용

SELECT DISTINCT A.USER_ID, A.PRODUCT_ID FROM ONLINE_SALE AS A 
JOIN ONLINE_SALE AS B ON A.USER_ID = B.USER_ID AND A.PRODUCT_ID = B.PRODUCT_ID
WHERE A.SALES_DATE != B.SALES_DATE
ORDER BY USER_ID, PRODUCT_ID DESC;

- 셀프 조인 이용! 

셀프 조인이란? 1개의 테이블에 가상으로 별칭을 부여해서 2개의 테이블로 간주해서 JOIN 하는 것

- FROM 절 : 테이블 1개가 2개인 것처럼 각각 다른 별칭 부여

- ON을 이용해서 USER_ID와 PRODUCT_ID가 같은 튜플들 연결해주기

- WHERE절에서 SALES_DATE는 겹치지 않도록! 관계 설정해주기

- DISTINCT를 이용해 중복값 제거

 

* 서브쿼리 이용해서 푸는 풀이도 봤는데, 간단하게 풀 수 있는데 굳이 서브쿼리를 써야할까? 연산비용이 늘어나지 않을까?

- BUT, 서브쿼리 공부할 필요성은 있음!!