본문 바로가기
Oracle SQL

GROUP BY 절과 HAVING 절

by Nowkeeh Ahc

GROUP BY

 SELECT 절에서 다중 행 함수를 특정 컬럼에 적용하여 사용할 때는 GROUP BY 절을 사용해야 한다. , GROUP BY 절은 기간별, 지역별, 지점별 등과 같이 컬럼 내의 특정 값을 기준으로 그룹을 묶을 때 사용한다. GROUP BY 절의 문법은 다음과 같다.

SELECT 컬럼명(or 다중 행 함수), 컬럼명(or 다중 행 함수),
FROM 테이블명
WHERE 조건
GROUP BY 그룹대상 (컬럼명)
ORDER BY 정렬대상 ;

 주의할 점은 SELECT 절에서 나열된 컬럼이나 표현식은 GROUP BY 절에도 포함되어야 한다는 점이다. 위와 같은 SQL문이 실행되면 우선 FROM 절에 기술된 테이블로부터 WHERE 절에 지정된 검색 조건과 일치하는 행들이 추출되고, 추출된 데이터들은 GROUP BY 절에 의해서 그룹화된다.

 ex. 지점상품 테이블에서 지점별 재고건수(보유량의 개수), 최대재고(보유량의 최대값), 최소재고(보유량의 최소값), 평균재고(보유량의 평균값)를 지점코드에 따라 그룹화시켜 출력하라.

SELECT 지점코드, 
	COUNT(보유량) "재고건수", 
	MAX(보유량) "최대재고", 
	MIN(보유량) "최소재고",
	TRUNC(AVG(보유량)) "평균재고"
FROM 지점상품
GROUP BY 지점코드
ORDER BY 지점코드;

 

HAVING

 HAVING 절은 GROUP BY 절에 의해서 생성된 결과 중에서 조건과 일치하는 데이터를 추출할 때 사용된다. 조건을 사용한다는 점에서 WHERE절과 비슷하다고 볼 수도 있다. 하지만 WHERE 절에서는 집계함수를 사용할 수 없고 HAVING절에서는 사용할 수 있다는 차이점이 있다. HAVING절에서는 GROUP BY 절에서 사용된 컬럼을 조건으로 써야한다. 만약 집계함수를 사용한다면 집계함수에서 사용하는 컬럼으로는 사용 가능하다. HAVING 절의 문법은 다음과 같다.

SELECT 컬럼명(or 다중 행 함수), 컬럼명(or 다중 행 함수),
FROM 테이블명
WHERE 조건
GROUP BY 그룹대상 (컬럼명)
HAVING 조건
ORDER BY 정렬대상 ;

 쿼리 실행 순서를 알고 있으면 쿼리를 작성할 때 도움이 많이 된다. 쿼리 실행 순서는 첫번째, FROM 절에 기술된 테이블로부터 데이터를 가져온다. 두번째, WHERE 절에 지정된 검색 조건과 일치하는 행들을 추출한다. 세번째, 추출된 데이터들은 GROUP BY 절에 의해서 그룹으로 묶인다. 네번째, 그룹으로 묶인 데이터 중에서 HAVING 절에서 지정된 조건과 일치한 행들이 다시 추출된다.

ex. 구매 테이블에서 2015년 6월에 상품을 구매한 고객 중에서 총구매가격의 합계가 100만 원 이상이면서 2회 이상 구매를 한 고객들을 마케팅의 대상으로 선정하고자 한다. 마케팅 대상의 조건에 맞는 고객ID와 해당 고객의 총구매가격, 구매횟수를 출력하라.

SELECT 고객ID
FROM 구매
WHERE TO_CHAR(구매일, 'YYMM') = '1506'
GROUP BY 고객ID
HAVING SUM(총구매가격) >=1000000 
AND COUNT(구매코드 고객ID) >= 2;

 


This post was written based on what I read and studied the book below.

http://www.yes24.com/Product/Goods/99002458

댓글