반응형

본 글은 책 "칼퇴족 김대리는 알고 나만 모르는 SQL 기초 편"의 정리 내용입니다.

그룹화된 데이터 필터링하기


SELECT 그룹화할 열 이름1, 
FROM 테이블명
WHERE 조건절
GROUP BY 열 이름1
HAVING 집계함수조건;

 

WHERE 조건절과의 차이점

  • WHERE 조건절은 무수히 많은 데이터에서 원하는 행만 보고 싶을 때 사용
  • HAVING 조건절은 행이 아닌 그룹화된 변수(GROUP BY 절 결과 이후)에 대해 필터링할 경우에 사용

 

2022.02.16 - [SQL] - [SQL] 데이터의 그룹화 (GROUP BY)

위의 글의 테이블을 참고하여 GROUP BY절을 이용하여 추출한 결과는 아래와 같다.

이름 ENG MATH GENDER
김필호 28 49 남자
이치훈 68 98 남자
김영숙 87 87 여자
성은영 65 78 여자

 

SELECT GENDER,
       AVG(ENG) AS ENG_AVERAGE,
       AVG(MATH) AS MATH_AVERAGE
FROM CLASS_SCORE
GROUP BY GENDER;
GENDER ENG_AVERAGE MATH_AVERAGE
남자 48.0 73.5
여자 76.0 82.5
  • GROUP BY 를 사용하여 성별(Gender)로 평균값을 계산 및 출력

 

이때, 수학 평균 정수(MATH_AVERAGE)가 80 이상인 그룹만 출력하길 원한다면? -> HAVING 절을 사용할 수 있다. 

SELECT GENDER,
       AVG(ENG) AS ENG_AVERAGE,
       AVG(MATH) AS MATH_AVERAGE
FROM CLASS_SCORE
GROUP BY GENDER
HAVING MATH_AVERAGE >=80;
GENDER ENG_AVERAGE MATH_AVERAGE
여자 76.0 82.5

 

예제 


고객구매 테이블: PROD_SALES

  • 열 설명: 고객 이름, 제품 코드, 구매금액
CUST_NM PRD_ID SALES_AMT
LEE 546 3000
KIM 324 4780
KANG 564 87900
KWON 556 45478
KIM 254 3000
YOO 567 78900
PARK 877 89787
LEE 890 10000
KIM 787 2341
PARK 566 50000
더보기
CREATE TABLE PROD_SALES
(
	CUST_NM CHAR(20) NOT NULL,
	PRD_ID INT NOT NULL,
	SALES_AMT INT NOT NULL,
	PRIMARY KEY('PRD_ID')
);

INSERT INTO PROD_SALES
VALUES
('LEE', 546,  3000),
('KIM', 324,  4780),
('KANG', 564, 87900),
('KWON', 556, 45478),
('KIM', 254,  3000),
('YOO', 567,  78900),
('PARK', 877, 89787),
('LEE', 890,  10000),
('KIM', 787,  2341),
('PARK', 566, 50000);

 

Q1. 구매 횟수가 두 번 이상인 고객에게 마케팅을 하려고 한다. 마케팅 대상자는 누구일까? 

더보기

A1. 

1단계. 먼저 COUNT 함수와 GROUP BY 절을 이용해 고객별 구매 횟수를 추출

SELECT CUST_NM, COUNT(*)
FROM PROD_SALES
GROUP BY CUST_NM;
CUST_NM COUNT(*)
KANG 1
KIM 3
KWON 1
LEE 2
PARK 2
YOO 1

 

2단계. HAVING 절을 이용해 구매 횟수가 2번 이상인 대상자를 추출

SELECT CUST_NM, COUNT(*)
FROM PROD_SALES
GROUP BY CUST_NM
HAVING COUNT(*)>=2;
CUST_NM COUNT(*)
KIM 3
LEE 2
PARK 2

 

 

Q2. 구매금액의 합이 7만원 이상인 고객에게 마케팅을 하려고 한다. 마케팅 대상자는 누구일까? 

더보기

A1. 

1단계. 먼저 SUM 함수와 GROUP BY 절을 이용해 고객별 구매금액을 추출

SELECT CUST_NM, SUM(SALES_AMT)
FROM PROD_SALES
GROUP BY CUST_NM;
CUST_NM SUM(SALES_AMT)
KANG 87900
KIM 10121
KWON 45478
LEE 13000
PARK 139787
YOO 78900

 

2단계. HAVING 절을 이용해 구매금액의 합이 7만원 이상인 대상자를 추출

SELECT CUST_NM, SUM(SALES_AMT)
FROM PROD_SALES
GROUP BY CUST_NM
HAVING SUM(SALES_AMT)>=70000;
CUST_NM SUM(SALES_AMT)
KANG 87900
PARK 139787
YOO 78900

 

Q3. 구매금액의 평균이 7만원 이상인 고객에게 마케팅을 하려고 한다. 마케팅 대상자는 누구일까?

더보기

A1. 

1단계. 먼저 AVG 함수와 GROUP BY 절을 이용해 고객별 구매금액을 추출

SELECT CUST_NM, AVG(SALES_AMT)
FROM PROD_SALES
GROUP BY CUST_NM;
CUST_NM AVG(SALES_AMT)
KANG 87900
KIM 3373.6667
KWON 45478
LEE 6500
PARK 69893.5
YOO 78900

 

2단계. HAVING 절을 이용해 구매금액의 평균이 7만원 이상인 대상자를 추출

SELECT CUST_NM, AVG(SALES_AMT)
FROM PROD_SALES
GROUP BY CUST_NM
HAVING AVG(SALES_AMT)>=70000;
CUST_NM AVG(SALES_AMT)
KANG 87900
YOO 78900

 

참고


  1. 그룹화 필터링 후 데이터를 정렬할 때 ORDER BY절을 사용할 수 있음
    • 순서는 ORDER BY절이 문장의 항상 마지막에 사용됨
    SELECT 열이름 
    FROM 테이블이름
    WHERE 조건절(개별 행에 대한 필터링) 
    GROUP BY 열이름
    HAVING 조건절(그룹화된 변수에 대한 필터링)
    ORDER BY 열이름
  2. WHERE 조건절의 조건은 데이터가 그룹화되기 전에 필터링하고, HAVING절의 조건은 데이터가 그룹화된 후에 필터링
  • WHERE 절에 의해 제외된 행은 그룹화할 때도 제외되기 때문에 HAVING절의 고려 대상이 아님
반응형

+ Recent posts