eterno

[MySQL] GROUP BY 절로 동일 컬럼 묶어서 계산하기 본문

DB/MYSQL

[MySQL] GROUP BY 절로 동일 컬럼 묶어서 계산하기

영원한별똥별 2023. 3. 8. 11:09
728x90
반응형

GROUP BY 란?

테이블에서 특정 속성의 값이 같은 투플을 모아 그룹을 만들고, 그룹별로 검색을 하기 위해 GROUP BY 키워드를 사용한다. 그룹에 대한 조건을 추가하려면 GROUP BY 키워드를 HAVING 키워드와 함께 사용하면 된다.

출처) 네이버 지식백과


SELECT 절 실행 순서

FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY 


GROUP  BY 사용법

   SELECT 조회할 컬럼명

   FROM 테이블명

   WHERE 조건문

   GROUP BY 그룹으로 묶을 컬럼명

   HAVING 그룹내 조건

   ORDER BY 정렬기준

 

** 그룹내 조건이 없다면 HAVING은 생략가능( WHERE이랑 헷갈리지 말기!)


GROUP BY 절에서 자주 사용하는 집계함수

COUNT(), SUM(), AVG(), MAX(), MIN(), STDEV(), VAR(), STRING_AGG()

 

그룹화 예제 테이블 : STUDENT

예제) STUDENT테이블을 GRADE 를 그룹화 하여 합계 구하기

SELECT  GRADE, 
		SUM(MATH) AS MATH_SUM, 
		SUM(ENGLISH) AS ENG_SUM, 
		SUM(KOREAN) AS KOR_SUM
FROM STUDENT
GROUP BY GRADE;

결과)

* GROUP BY 할때 문자열로 된 숫자는 CAST(데이터 타입 변경) 해주어야 합계가 가능

   => CAST ( 변경할 컬럼명 AS 변경할 데이터타입)


그룹화한 데이터 조건 추가하기

예제) STUDENT테이블에서 GRADE가 2이상인 데이터를 그룹화 하여 조회

SELECT  GRADE, 
		SUM(MATH) AS MATH_SUM, 
		SUM(ENGLISH) AS ENG_SUM, 
		SUM(KOREAN) AS KOR_SUM
FROM STUDENT
GROUP BY GRADE
HAVING GRADE >= 2;

결과)


그룹별 소계(합계) 구하는 WITH ROLLUP 

GROUP BY 그룹화할 컬럼명 WITH ROLLUP ;

 

예제) STUDENT 테이블에 GRADE 별로 그룹화하여 소계 구하기

SELECT  GRADE, NAME,
		SUM(MATH) AS MATH_SUM, 
		SUM(ENGLISH) AS ENG_SUM, 
		SUM(KOREAN) AS KOR_SUM
FROM STUDENT
GROUP BY GRADE, NAME WITH ROLLUP;

결과)


그룹별 함수의 데이터 값이 null로 나오는데 다른 값으로 변경하고 싶다면

그룹화된 컬럼에 COALESCE을 사용하면 된다.

=> COALESCE(컬럼명, '변경할 데이터 값')

SELECT  COALESCE(GRADE, '합계') AS GRADE, 
		COALESCE(NAME,'등급별합계') AS NAME,
		SUM(CAST(MATH AS SIGNED)) AS MATH_SUM, 
		SUM(CAST(ENGLISH AS SIGNED)) AS ENG_SUM, 
		SUM(CAST(KOREAN AS SIGNED)) AS KOR_SUM
FROM STUDENT
GROUP BY GRADE, NAME WITH ROLLUP;

 

결과)

 

 

참고) https://gent.tistory.com/505#h3_1

 

728x90
반응형