🛠️Skill/SQL

[SQL문법] GROUP BY / HAVING - MySQL

Istj_eff 2022. 11. 7. 19:33

1. GROUP BY (특정 컬럼을 기준으로 그룹화)

💡 
SELECT
 칼럼1, 칼럼2, 집계함수
FROM 테이블이름
GROUP BY 칼럼1, 칼럼2

GROUP BY 후, SUM/MAX/AVG 구하기

SELECT REGION, INDCODE,
	   SUM(MKT_CAPITALIZATION_USD), -- 그룹기준으로 MKT를 SUM 해줘
	   MAX(MKT_CAPITALIZATION_USD),
     AVG(MKT_CAPITALIZATION_USD)
FROM stock_info
GROUP BY REGION, INDCODE; -- REGION, INDCODE 기준으로 묶어줘

 

✅부서별로 그룹하여 부서번호, 인원수, 급여의 평균, 급여의 합을 조회

SELECT deptno, COUNT(*), ROUND(AVG(sal)) '급여평균', ROUND(SUM(sal)) '급여합계'
FROM emp
GROUP BY deptno;

[OUT]

DEPTNO   COUNT(*)    급여평균    급여합계

30          6       1567       9400

20          5       2175      10875

10          3       2917       8750

 

 


2. HAVING (그룹화 & 요약한 컬럼을 기준으로 조건 걸기)

💡 
SELECT 칼럼1, 칼럼2, 집계함수
FROM 테이블이름
GROUP BY 칼럼1, 칼럼2
HAVING 집계함수조건

 

✅HAVING 예제

SELECT REGION, INDCODE,
	   SUM(MKT_CAPITALIZATION_USD), -- REGION으로 그룹짓고 그룹기준으로 MKT를 SUM 해줘
	   MAX(MKT_CAPITALIZATION_USD),
       AVG(MKT_CAPITALIZATION_USD)
FROM stock_info
GROUP BY REGION, INDCODE
HAVING AVG(MKT_CAPITALIZATION_USD) > 50000; -- 그룹화해서 AVG을 구한 값들중 5만이상인 데이터만 추출

 

 

3. 문제

1 ) Financial_Info 테이블에서 각 연도별 Operating_Income의 최소값, 최대값, 평균값을 구해보세요.

SELECT FiscalPrd_,
		   MIN(VALUE_),
		   MAX(VALUE_),
	     AVG(VALUE_)
FROM financial_info
WHERE NAME_ = 'OPERATING INCOME' -- WHERE조건은 GROUP하기전에 해야함
GROUP BY FiscalPrd_;

 

 

2 ) Stock_Info 테이블에서 각 IndCode별 시가총액 평균을 구하고 시가총액 평균값이 100,000 이상인 데이터만 조회해보세요.

SELECT INDCODE,
	   AVG(Mkt_Capitalization_USD)
FROM stock_info
GROUP BY INDCODE
HAVING AVG(Mkt_Capitalization_USD) > 100000
ORDER BY AVG(Mkt_Capitalization_USD) DESC; -- 내림차순 정렬