본문 바로가기

SQL/SQLD (개발자)

2-1. SQL 기본_(7)GROUP BY, HAVING 절

제7절 GROUP BY, HAVING 절


1. 집계 함수(Aggregate Function)
- 그룹당 단 하나의 결과를 추출하는 함수
- GROUP BY 절은 행들을 소그룹화
- SELECT 절, HAVING 절, ORDER BY 절에 사용

집계 함수 사용 목적
COUNT(*) NULL 값을 포함한 행의 개수
COUNT(컬럼1) 컬럼1에서 NULL을 제외한 행의 개수
SUM(컬럼1)
SUM(DISTINCT 컬럼1)
컬럼1에서 NULL을 제외한 행의 합계
AVG(컬럼1)
AVG(DISTINCT 컬럼1)
컬럼1에서 NULL을 제외한 행의 평균
MAX(컬럼1)
MAX(DISTINCT 컬럼1)
컬럼1에서 최대값 (문자, 날짜도 사용가능)
MIN(컬럼1)
MIN(DISTINCT 컬럼1)
컬럼1에서 최소값 (문자, 날짜도 사용가능)
STDDEV(컬럼1)
STDDEV(DISTINCT 컬럼1)
컬럼1에서 행의 표준편차
VARIAN(컬럼1)
VARIAN(DISTINCT 컬럼1)
컬럼1에서 행의 분산

 

위와 같은 테이블에서 집계함수를 사용해 보겠습니다.

SELECT 	COUNT(*) AS ROW_N #전체 행의 개수 
	, COUNT(DISTINCT CustomerId) AS CustomerId_N #중복없는 고객ID의 개수 
    	, SUM(Total) AS Total_SUM #Total의 합계 
    	, AVG(Total) AS Total_AVG #Total의 평균 
    	, MAX(Total) AS Total_MAX #Total의 최대값 
    	, MIN(InvoiceDate) AS InvoiceDate_MIN #주문날짜의 최소값(가장 빠른날) 
FROM Invoice



2. GROUP BY 절
- 그룹별로 데이터를 확인 할 때 사용

# GROUP BY 절 기본 구조 

SELECT DISTINCT 컬럼1, 컬럼2 # 네번째 실행 
FROM 테이블명 # 첫번째 실행 
WHERE 조건 # 두번째 실행 
GROUP BY 컬럼1, 컬럼2 # 세번째 실행

 

SELECT 	BillingCountry 
	, COUNT(Total) AS COUNT_Country # 국가별로 Total의 개수 
    	, SUM(Total) AS SUM_Country # 국가별로 Total의 합계 
    	, AVG(Total) AS AVG_Country # 국가별로 Total의 평균 
FROM Invoice 
WHERE BillingCountry IS NOT NULL # BillingCountry가 NULL이 아닌 행만 가져오기 
GROUP BY BillingCountry # 국가별로 그룹만들기



3. HAVING 절
- WHERE절에서 사용할 수 없는 집계함수를 HAVING 절을 통해 사용가능
- GROUP BY 절 다음에 사용

SELECT 	BillingCountry 
	, COUNT(Total) AS COUNT_Country # 국가별로 Total의 개수 
    , SUM(Total) AS SUM_Country # 국가별로 Total의 합계 
    , AVG(Total) AS AVG_Country # 국가별로 Total의 평균 
FROM Invoice 
WHERE BillingCountry IS NOT NULL # BillingCountry가 NULL이 아닌 행만 가져오기 
GROUP BY BillingCountry # 국가별로 그룹만들기 
HAVING COUNT(Total) >= 10 # 국가별 Total의 개수가 10개 이상인 행만 추출



4. CASE 표현을 활용한 월별 데이터 집계

# 국가별 그룹화 된 데이터를 가지고 월별 데이터 추출하기 

SELECT 	BillingCountry 
	, AVG(CASE OrderDate WHEN '2007-01' THEN Total END) '2007-01' 
        , AVG(CASE OrderDate WHEN '2007-02' THEN Total END) '2007-02' 
        , AVG(CASE OrderDate WHEN '2007-03' THEN Total END) '2007-03' 
        , AVG(CASE OrderDate WHEN '2007-04' THEN Total END) '2007-04' 
        , AVG(CASE OrderDate WHEN '2007-05' THEN Total END) '2007-05' 
FROM Invoice 
GROUP BY BillingCountry