반응형
본 글은 책 "칼퇴족 김대리는 알고 나만 모르는 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 |
참고
- 그룹화 필터링 후 데이터를 정렬할 때 ORDER BY절을 사용할 수 있음
- 순서는 ORDER BY절이 문장의 항상 마지막에 사용됨
SELECT 열이름 FROM 테이블이름 WHERE 조건절(개별 행에 대한 필터링) GROUP BY 열이름 HAVING 조건절(그룹화된 변수에 대한 필터링) ORDER BY 열이름
- WHERE 조건절의 조건은 데이터가 그룹화되기 전에 필터링하고, HAVING절의 조건은 데이터가 그룹화된 후에 필터링
- WHERE 절에 의해 제외된 행은 그룹화할 때도 제외되기 때문에 HAVING절의 고려 대상이 아님
반응형
'SQL' 카테고리의 다른 글
[SQL] 테이블 합치기 (LEFT OUTER JOIN) (0) | 2022.02.17 |
---|---|
[SQL] 테이블 합치기 (INNER JOIN) (0) | 2022.02.17 |
[SQL] 데이터의 그룹화 (GROUP BY) (0) | 2022.02.16 |
[SQL] 숫자 데이터 요약하기 (SUM, AVG, MAX, MIN, STDENV, VARIANCE) (0) | 2022.02.16 |
[SQL] 행의 수 세기 (COUNT) (0) | 2022.02.14 |