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 데이터 분석, 활용!'