SQL 집계 함수(SUM, COUNT 등) 사용법 및 실무 활용 가이드
페이지 정보

본문
그누보드 환경을 포함한 MySQL 데이터베이스에서 SUM, COUNT 등 집계 함수를 사용하여 데이터를 요약하고 통계를 추출하는 방법을 정리합니다.
SQL 집계 함수 기본 문법
데이터베이스에서 특정 컬럼의 합계나 개수를 구하려면 집계 함수(Aggregate Functions)를 사용합니다. 집계 함수는 여러 행의 데이터를 하나의 값으로 요약하여 반환합니다.
1. 합계 구하기: SUM()
숫자형 컬럼의 총합을 계산할 때 사용합니다. 문자열이나 날짜형 컬럼에는 사용할 수 없으며, NULL 값은 무시하고 계산합니다.
- 기본 구문:
SELECT SUM(필드명) AS 별칭 FROM 테이블명; - 예시:
SELECT SUM(price) AS total_price FROM products;
2. 개수 구하기: COUNT()
데이터의 행 개수를 셀 때 사용합니다.
- 전체 행 개수:
SELECT COUNT(*) FROM 테이블명;(NULL 포함) - 특정 컬럼 개수:
SELECT COUNT(필드명) FROM 테이블명;(NULL 제외)
3. 주요 활용 옵션
- 별칭(Alias) 사용:
AS키워드를 사용하여 결과 필드에 이름을 붙여 가독성을 높입니다. - 중복 제거(DISTINCT): 중복된 값을 제외하고 집계하려면 함수 내부에
DISTINCT를 사용합니다.- 예:
SELECT COUNT(DISTINCT category) FROM products;
- 예:
- 그룹별 집계(GROUP BY): 특정 컬럼을 기준으로 그룹을 나누어 합계나 개수를 구할 때 사용합니다.
- 예:
SELECT category, SUM(price) FROM products GROUP BY category;
- 예:
주의사항
- 집계 함수는 여러 행을 하나로 묶어 결과를 반환하므로, 일반 컬럼과 함께 조회할 때는 반드시
GROUP BY절에 해당 컬럼을 명시해야 합니다. - 계산식 적용:
SUM(income - expenses)와 같이 함수 내부에 수식을 직접 작성하여 결과를 도출할 수도 있습니다.
GROUP BY를 이용한 그룹별 집계 방법
데이터베이스에서 카테고리별, 사용자별 등 특정 기준에 따라 데이터를 묶어 합계나 평균을 구하려면 GROUP BY 절을 사용합니다. GROUP BY는 지정된 컬럼의 값이 같은 행들을 하나의 그룹으로 묶어주며, 이 그룹에 집계 함수(SUM, AVG, COUNT 등)를 적용하여 통계치를 산출합니다.
기본 문법 및 사용 예시
특정 컬럼을 기준으로 그룹화하여 집계할 때는 SELECT 문에 그룹화할 컬럼과 집계 함수를 함께 작성합니다.
- 기본 구조:
SELECT 컬럼명, 집계함수(대상컬럼) AS 별칭 FROM 테이블명 GROUP BY 컬럼명; - 활용 예시 (부서별 총 매출 합계):
SELECT department, SUM(sales) AS "Total sales" FROM order_details GROUP BY department;
주의사항 및 핵심 규칙
- SELECT 절의 제약:
SELECT문에 집계 함수에 포함되지 않은 일반 컬럼을 작성할 경우, 해당 컬럼은 반드시GROUP BY절에도 명시되어야 합니다. - 중복 제거 효과:
GROUP BY를 사용하면 결과적으로 해당 컬럼의 중복이 제거된 목록을 얻게 되며, 이는DISTINCT와 유사한 중복 제거 효과를 가집니다. - 조건 필터링: 집계된 결과에 대해 조건을 걸어 필터링하고 싶을 때는
WHERE대신HAVING절을 사용합니다. - NULL 처리: 집계 함수는 기본적으로
NULL값을 무시하고 계산합니다.
실무 팁
- 통계 데이터 추출: "카테고리별 평균 가격", "도시별 고객 수", "월별 주문 건수" 등 실무에서 요약된 인사이트가 필요할 때 필수적으로 사용됩니다.
- 계산식 적용:
SUM(income - expenses)와 같이 집계 함수 내부에 직접 계산식을 넣어 결과값을 도출할 수도 있습니다.
집계 결과 필터링을 위한 HAVING 절 사용법
SQL에서 GROUP BY를 사용하여 데이터를 그룹화한 후, 집계된 결과값(예: 합계, 개수 등)을 기준으로 데이터를 필터링하려면 HAVING 절을 사용해야 합니다.
WHERE와 HAVING의 차이
- WHERE:
GROUP BY가 실행되기 전, 개별 행(row) 단위로 데이터를 필터링할 때 사용합니다. - HAVING:
GROUP BY가 실행된 후, 집계된 결과값에 대해 조건을 적용할 때 사용합니다.
사용 예시
댓글이 2개 이상 있는 게시물만 조회하는 경우의 쿼리 구조입니다.
SELECT post_id, COUNT(*) AS comment_count
FROM comments
GROUP BY post_id
HAVING COUNT(*) >= 2;
적용 순서
- WHERE: 그룹화하기 전 전체 데이터에서 특정 조건에 맞는 행을 먼저 추출합니다.
- GROUP BY: 추출된 데이터를 특정 컬럼 기준으로 그룹화합니다.
- HAVING: 그룹화된 결과에서 집계 함수(SUM, COUNT 등)의 결과값을 기준으로 최종 필터링합니다.
이처럼 HAVING은 집계 함수를 포함한 조건식을 지정할 수 있어, 단순히 행을 거르는 WHERE 절로는 처리할 수 없는 통계적 필터링에 필수적입니다.
SQL 집계 결과의 소수점 처리 및 계산식 적용
데이터베이스에서 SUM이나 AVG와 같은 집계 함수를 사용할 때, 계산식을 적용하거나 결과값의 소수점 자릿수를 제어하여 원하는 형식으로 출력할 수 있습니다.
1. 계산식 적용
집계 함수 내부에 직접 산술 연산자를 사용하여 계산을 수행할 수 있습니다. 예를 들어, 매출에서 비용을 뺀 순이익을 구하거나, 특정 비율을 곱하여 수수료를 계산하는 방식입니다.
- 순이익 계산:
SELECT SUM(income - expenses) AS "Net Income" FROM gl_transactions; - 수수료 계산 (10%):
SELECT SUM(sales * 0.10) AS "Commission" FROM order_details;
2. 소수점 처리 (반올림 및 버림)
집계된 결과값의 소수점 자릿수를 조정하려면 ROUND 또는 TRUNCATE 함수를 사용합니다.
- ROUND(값, 자릿수): 지정된 자릿수까지 반올림합니다.
SELECT ROUND(AVG(price), 2) AS average_price FROM books;(소수점 둘째 자리까지 반올림)- 자릿수를 생략하면 정수로 반올림됩니다.
- TRUNCATE(값, 자릿수): 지정된 자릿수 이후를 버림(절삭)합니다.
SELECT TRUNCATE(SUM(price), 1) AS total_price FROM orders;(소수점 첫째 자리까지 표시하고 나머지는 버림)TRUNCATE(값, 0)을 사용하면 소수점 이하를 모두 버리고 정수만 남깁니다.
3. 실무 활용 예시
여러 집계 함수와 계산식을 조합하여 복합적인 통계 데이터를 추출할 수 있습니다.
- 중간값 계산 예시:
TRUNCATE((MAX(Price) + MIN(Price)) / 2, 2) AS MedianPrice - 날짜 차이 평균 계산:
TRUNCATE(AVG(DATEDIFF(LAST_DAY(OrderDate), OrderDate)), 1) AS AVG_DATE_DIFF
데이터 출력 시 의도한 소수점 자릿수가 나오지 않는다면, TRUNCATE를 사용하여 강제로 자릿수를 고정하거나 반올림 방식을 확인하시기 바랍니다.
상황별 SQL 집계 함수 활용 가이드
| 내 상황 | 우선할 판단 | 다음 행동 |
|---|---|---|
| 전체 데이터의 합계나 개수가 필요함 | 집계 함수(SUM, COUNT) 사용 | SELECT SUM(필드명) AS 별칭 FROM 테이블명 실행 |
| 카테고리별 통계(그룹별 합계 등)가 필요함 | GROUP BY 절 추가 | GROUP BY 그룹기준컬럼을 SELECT 문 뒤에 작성 |
| 집계된 결과값에 조건을 걸어 필터링함 | HAVING 절 사용 | GROUP BY 뒤에 HAVING 집계함수(컬럼) 조건 작성 |
| 중복된 값을 제외하고 고유한 개수를 셈 | DISTINCT 키워드 포함 | COUNT(DISTINCT 컬럼명) 형태로 작성 |
| 계산된 결과의 소수점을 제어함 | ROUND 또는 TRUNCATE 함수 | ROUND(SUM(컬럼), 자릿수)로 반올림 또는 버림 처리 |
실전 FAQ
Q: GROUP BY를 사용할 때 SELECT 절에 일반 컬럼을 같이 쓰면 오류가 나요.
A: 집계 함수에 포함되지 않은 일반 컬럼은 반드시 GROUP BY 절에도 명시해야 합니다. 그렇지 않으면 데이터베이스가 어떤 기준으로 그룹을 묶어야 할지 판단하지 못해 오류가 발생합니다.
Q: WHERE와 HAVING은 어떻게 구분해서 사용하나요?
A: WHERE는 그룹화하기 전 개별 행을 필터링할 때 사용하고, HAVING은 그룹화가 끝난 후 집계된 결과값(합계, 평균 등)을 필터링할 때 사용합니다. 순서상 WHERE가 먼저 실행됩니다.
Q: SUM() 함수 사용 시 소수점이 반올림되어 정수로 나와요.
A: 데이터베이스의 필드 타입이 정수형(INT)인지 확인하세요. 소수점까지 정확히 표현하려면 TRUNCATE(SUM(컬럼), 자릿수) 함수를 사용하여 강제로 자릿수를 지정하거나, 필드 타입을 FLOAT/DOUBLE로 변경해야 합니다.
Q: COUNT(*)와 COUNT(컬럼명)의 차이는 무엇인가요?
A: COUNT(*)는 NULL 값을 포함한 모든 행의 개수를 세지만, COUNT(컬럼명)은 해당 컬럼의 값이 NULL인 행을 제외하고 개수를 셉니다.
참고자료
기타 참고자료
- m.blog.naver.com — SQL 집계와 서브쿼리 - COUNT , DISTINCT, SUM, AVG, MIN, MAX, GROUP BY, HAVING, 서브쿼리 : 네이버 블로그
- velog.io — SQL 문법 ) GROUP BY 그룹 묶어주기 + 집계 함수 (SUM, AVG, MIN, MAX, COUNT(DISTINCT))+ 조건절 HAVING
- qcoding.tistory.com — MY_SQL 많이 쓰는 구문 정리 - 2) 집계함수 (GROUP BY) /DISTINCT
- stonefree.tistory.com — PHP MySQL 집계함수 sum, avg, max, min
- wikidocs.net — 05-06 집계 함수와 그룹 데이터 처리 - 숏텀 PHP
- velog.io — MySQL 집계함수: COUNT, SUM, AVG, MAX, MIN, GROUP BY
- velog.io — 집계와 그룹화, COUNT, SUM, AVG로 통계 내기
- 이전글PHP 서버 변수 PHPSELF, SCRIPTNAME, REQUESTURI 차이점과 활용 26.10.05
- 다음글PHP 단축 태그(shortopentag) 사용 시 유의사항 및 권장 표준 26.10.05
댓글목록
등록된 댓글이 없습니다.