DB/PostgreSQL

19. HAVING, ORDER BY, LIMIT절 개요 (그룹 필터링) | NUll 값을 비교할때는 IS NULL, IS NOT NULL

DEV-HJ 2022. 11. 7. 23:57
반응형

HAVING

- 분류된 그룹들 중 "특정" 그룹만 가져오는 것

- WHERE 절은 일반 레코드를 필터링

- HAVING 절은 반드시 그룹화된 레코드만 필터링

-- 결제 테이블에서 수단별 평균 결제 금액이 다음과 같을때, 평균 결제금액이 36,000원 이상인 것만 조회
SELECT ptype, ROUND(AVG(amount)) AS "평균결제금액"
FROM payments
GROUP BY ptype
HAVING ROUND(AVG(amount)) >= 36000;


-- 상품명과 가격을 기준으로 누적 매출이 35,000원 이상인 상품을 조회하시오
SELECT
	name AS 상품명,
	price AS 가격,
	SUM(order_details.count) AS 누적판매량,
	SUM(products.price * order_details.count) AS 누적매출
FROM
	products
LEFT JOIN order_details ON
	order_details.product_id = products.id
GROUP BY 
	name, price
HAVING
	SUM(products.price * order_details.count) >= 35000;


-- 누적 매출이 2만원 이상이면서, 누적 판매량도 10개 이상인 상품을 조회하시오
SELECT 
 	NAME AS "상품명"
   ,PRICE AS "가격"
   ,SUM(ORDER_DETAILS.COUNT) AS "누적판매량"
   ,SUM(PRICE * ORDER_DETAILS.COUNT) AS "누적매출"
FROM 
	PRODUCTS
LEFT JOIN ORDER_DETAILS ON
	ORDER_DETAILS.PRODUCT_ID = PRODUCTS.id
GROUP BY
	NAME, PRICE
HAVING 
	SUM(PRICE * ORDER_DETAILS.COUNT) >= 20000
AND
 	SUM(ORDER_DETAILS.COUNT) >= 10;

 


ORDER BY

- 결과를 정렬하는 문법

- 오름차순 ASC

- 내림차순 DESC

	
-- 누적 매출이 없는 제품을, 가격을 기준으로 오름차순 정렬하여 조회하시오
SELECT 
	NAME AS "상품명"
   ,PRICE AS "가격"
   ,SUM(ORDER_DETAILS.COUNT) AS "누적판매량"
   ,SUM(PRICE * ORDER_DETAILS.COUNT) AS "누적매출"
FROM
	PRODUCTS
LEFT JOIN 
	ORDER_DETAILS
ON
	PRODUCTS.ID =  ORDER_DETAILS.PRODUCT_ID
GROUP BY
	NAME, PRICE
HAVING 
-- 수식은 숫자만 비교할수 있음 
-- NULL 값은 IS로 가져와야함
	SUM(PRICE * ORDER_DETAILS.COUNT) IS NULL
ORDER BY PRICE;


LIMIT

- 가져온 레코드의 갯수를 제한하는 문

- 데이터가 너무 많아서 가져오기 어렵다거나, 혹은 일부 몇개만 가져오고 싶을때 사용

-- 누적매출 상위 5개 상품을 조회하시오 
SELECT 
	NAME AS "상품명"
   ,PRICE AS "가격"
   ,SUM(ORDER_DETAILS.COUNT) AS "누적판매량"
   ,SUM(PRICE * ORDER_DETAILS.COUNT) AS "누적매출"
FROM
	PRODUCTS
LEFT JOIN 
	ORDER_DETAILS
ON
	PRODUCTS.ID =  ORDER_DETAILS.PRODUCT_ID
GROUP BY
	NAME, PRICE
HAVING 
 	-- 누적매출이 Null이 아닌 데이터 가져오기
	SUM(PRICE * ORDER_DETAILS.COUNT) IS NOT NULL 
ORDER BY 
"누적매출" DESC
LIMIT
	5;


 

반응형