Programming/Postgres DB
[PostgresDB-2] 17. 그룹필터링 (HAVING, ORDER BY, LIMIT)
midnightcoder
2022. 12. 29. 04:20
이전 포스팅에서 생성한 마켓컬리 데이터로 그룹 필터링에 관해서 실습
참고 : https://cloudstudying.kr/lectures/513
DB 데이터
DB 구조도
1. 결재(payments) 테이블에서 수단별 평균 결제 금액이 다음과 같을 때, 평균 결제 금액이 36,000원 이상인 것만 조회하시오
SELECT
ptype AS "결제 수단",
ROUND(AVG(amount), 2) AS "평균 결제금액"
FROM
payments
GROUP BY
ptype
여기에 HAVING 절을 추가해서 평균 결제금액이 36,000이상 인것을 필터링한다.
SELECT
ptype AS "결제 수단",
ROUND(AVG(amount), 2) AS "평균 결제금액"
FROM
payments
GROUP BY
ptype
HAVING -- 그룹 필터링 : 그룹화된 것들을 조건으로 선별!
AVG(amount) >= 36000
;
2. 다음 쿼리는 상품명과 가격을 기준으로, 누적 판매정보를 조회한다.
이를 참고하여 주어진 문제를 푸시오
-- 상품 이름과 가격을 기준으로, 누적 판매정보(판매량, 매출)를 조회
SELECT -- 4
products.name AS "상품명",
products.price AS "가격",
SUM(order_details.count) AS "누적 판매량",
SUM(products.price * order_details.count) AS "누적 매출"
FROM -- 1
products
LEFT JOIN order_details ON -- 2
order_details.product_id = products.id
GROUP BY -- 3
products.name,
products.price
;
(a) 누적 매출이 35,000원 이상인 상품을 조회하시오.
SELECT -- 4
products.name AS "상품명",
products.price AS "가격",
SUM(order_details.count) AS "누적 판매량",
SUM(products.price * order_details.count) AS "누적 매출"
FROM -- 1
products
LEFT JOIN order_details ON -- 2
order_details.product_id = products.id
GROUP BY -- 3
products.name,
products.price
HAVING
SUM(products.price * order_details.count) >= 35000
;
(b) 누적 매출이 2만원 이상이면서, 누적 판매량도 10개 이상인 상품을 조회하시오.
SELECT -- 4
products.name AS "상품명",
products.price AS "가격",
SUM(order_details.count) AS "누적 판매량",
SUM(products.price * order_details.count) AS "누적 매출"
FROM -- 1
products
LEFT JOIN order_details ON -- 2
order_details.product_id = products.id
GROUP BY -- 3
products.name,
products.price
HAVING
SUM(products.price * order_details.count) >= 20000
AND
SUM(order_details.count) >= 10
;
(c) 누적 매출이 없는 제품을, 가격을 기준으로 오름차순 정렬하여 조회하시오
SELECT -- 4
products.name AS "상품명",
products.price AS "가격",
SUM(order_details.count) AS "누적 판매량",
SUM(products.price * order_details.count) AS "누적 매출"
FROM -- 1
products
LEFT JOIN order_details ON -- 2
order_details.product_id = products.id
GROUP BY -- 3
products.name,
products.price
HAVING
-- 누적 매출이 없다? NULL (단, NULL은 IS 로 확인해야됨)
SUM(products.price * order_details.count) IS NULL
ORDER BY
products.price
;
** 중요한 POINT 두가지
1. NULL 비교는 수식( = )을 사용하지 않고 IS 를 사용한다.
2. 정렬을 할때에는 ORDER BY 로 한다. (단, 오름차순은 뒤에 ASC 생략가능)
ORDER BY
products.price ASC
;
(d) 누적 매출 상위 5개 상품을 조회하시오
-- (d) 누적 매출 상위 5개 상품을 조회하시오
SELECT -- 4
products.name AS "상품명",
products.price AS "가격",
SUM(order_details.count) AS "누적 판매량",
SUM(products.price * order_details.count) AS "누적 매출"
FROM -- 1
products
LEFT JOIN order_details ON -- 2
order_details.product_id = products.id
GROUP BY -- 3
products.name,
products.price
HAVING
SUM(products.price * order_details.count) IS NOT null
ORDER BY
"누적 매출" DESC
LIMIT
5
;
출처 : 홍팍의 'SQL 데이터 분석, 활용!'