group by 를 사용하고 집계함수를 써 결과 값을 만들어 내는데, 그 결과 값을 필터링 하기 위함
where는 결과 이전을 필터링 하고 having은 그 이후를 필터링
구매량이 200 이상인 고객을 찾고 싶다
SELECT p.customer_id
,sum(p.amount) AS amount
FROM payment p
GROUP BY customer_id
HAVING sum(p.amount) > 200
ORDER BY amount DESC;
ORDER BY amount 는 됐는데, HAVING amount > 200 은 안됨.
구매량의 합이 190 이상인 고객이 이용한 매장을 알고 싶다
SELECT
p.customer_id
,c.store_id
,sum(p.amount) AS amount
FROM payment p ,customer c
WHERE p.customer_id = c.customer_id
GROUP BY p.customer_id ,c.store_id
HAVING sum(p.amount) > 190
ORDER BY amount DESC;
WHERE로 ROW를 통일하고, HAVING으로 필터링
각 매장별로 구매량의 합이 120 이상인 고객의 수를 알고 싶다
먼저 구매량의 합이 120 이상인 고객의 customer_id 를 구한다
SELECT p.customer_id
FROM payment p
GROUP BY p.customer_id
HAVING sum(p.amount ) >120;
그리고 고객이 속한 store_id를 찾아서 count 한다
SELECT
c3.store_id
,count(c3.customer_id)
FROM customer c3
WHERE c3.customer_id in(
SELECT p.customer_id
FROM payment p
GROUP BY p.customer_id
HAVING sum(p.amount ) >120)
GROUP BY c3.store_id
;
'데이터 분석 > SQL' 카테고리의 다른 글
[SQL 문법] ROLLUP ( ) 절 (0) | 2020.11.05 |
---|---|
[SQL 문법] GROUPING SET 절, GROUPING 함수 (0) | 2020.11.04 |
[SQL 문법] GROUP BY (0) | 2020.11.04 |
[SQL 문법] NATURAL JOIN (0) | 2020.11.04 |
[SQL 문법] CROSS JOIN (0) | 2020.11.04 |