본문 바로가기
프로그래밍/MySQL

📊 [SQL 프로젝트] 제21장 여러 집계 함수를 함께 사용하기 - 하나의 통계 보고서 만들기

by 강릉바다의 블로그 2026. 7. 2.

제21장 여러 집계 함수를 함께 사용하기 - 하나의 통계 보고서 만들기


📚 집계 함수 활용 시리즈

① COUNT
② SUM
③ AVG
④ MIN / MAX
⑤ 여러 집계 함수를 함께 사용하기   ← 현재

지금까지는 집계 함수를 하나씩 배웠습니다.

  • COUNT()
  • SUM()
  • AVG()
  • MAX()
  • MIN()

하지만 실제 업무에서는 이 함수들을 하나씩 따로 사용하는 경우보다 여러 개를 한 번에 사용하는 경우가 훨씬 많습니다.

이번 장에서는 지금까지 배운 집계 함수를 조합하여 하나의 통계 보고서를 만드는 방법을 배워 보겠습니다.


오늘의 질문

상품관리팀에서 다음과 같이 요청했습니다.

"카테고리별 상품 현황을 한눈에 보고 싶습니다."

 

팀장님이 원하는 보고서에는 다음 정보가 모두 포함되어야 합니다.

  • 상품 개수
  • 총 가격
  • 평균 가격
  • 최고 가격
  • 최저 가격

각 정보를 따로 조회할 수도 있지만, SQL은 한 번의 조회로 여러 통계를 함께 계산할 수 있습니다.


학습 목표

이번 장을 학습하면 다음 내용을 할 수 있습니다.

  • 여러 집계 함수를 동시에 사용할 수 있다.
  • 하나의 SQL로 통계 보고서를 작성할 수 있다.
  • GROUP BY와 함께 다양한 통계를 계산할 수 있다.
  • 실제 업무에서 활용되는 통계 SQL을 이해할 수 있다.

21-1. 여러 집계 함수를 함께 사용할 수 있을까요?

물론 가능합니다.

다음 SQL을 실행해 봅시다.

SELECT CategoryID,
       COUNT(*) AS ProductCount,
       SUM(Price) AS TotalPrice,
       AVG(Price) AS AveragePrice,
       MAX(Price) AS HighestPrice,
       MIN(Price) AS LowestPrice
FROM Products
GROUP BY CategoryID;

실행 결과(예)

CategoryID ProductCount TotalPrice AveragePrice HighestPrice LowestPrice
1 12 542.30 45.19 81.00 18.00
2 10 301.40 30.14 43.90 10.00
3 13 693.00 53.31 97.00 15.00
... ... ... ... ... ...

카테고리별 상품 현황을 한 번에 확인할 수 있습니다.


SQL을 한 줄씩 읽어 보기

SELECT CategoryID,

카테고리 번호를 출력합니다.


COUNT(*) AS ProductCount,

상품 개수를 계산합니다.


SUM(Price) AS TotalPrice,

상품 가격의 합계를 계산합니다.


AVG(Price) AS AveragePrice,

평균 가격을 계산합니다.


MAX(Price) AS HighestPrice,

가장 비싼 상품 가격입니다.


MIN(Price) AS LowestPrice

가장 저렴한 상품 가격입니다.


GROUP BY CategoryID;

카테고리별로 각각 계산합니다.


즉,

카테고리별 상품 통계 보고서를 만들어라.

라는 의미입니다.


잠깐 생각해 보기

지금 작성한 SQL에는 지금까지 배운 내용이 거의 모두 들어 있습니다.

문법 역할
SELECT 출력할 항목 선택
COUNT() 상품 개수
SUM() 가격 합계
AVG() 평균 가격
MAX() 최고 가격
MIN() 최저 가격
GROUP BY 카테고리별 계산

학생들에게는 이 SQL이 지금까지 학습한 내용을 종합한 대표 예제라는 점을 강조해 주세요.


21-2. ORDER BY와 함께 사용하기

이번에는 평균 가격이 높은 카테고리부터 출력해 보겠습니다.

SELECT CategoryID,
       COUNT(*) AS ProductCount,
       AVG(Price) AS AveragePrice
FROM Products
GROUP BY CategoryID
ORDER BY AveragePrice DESC;

실행 결과는 평균 가격이 높은 순서대로 출력됩니다.

보고서를 보기 좋게 정렬할 때 자주 사용하는 방법입니다.


21-3. HAVING과 함께 사용하기

이번에는 상품이 10개 이상인 카테고리만 출력해 보겠습니다.

SELECT CategoryID,
       COUNT(*) AS ProductCount,
       AVG(Price) AS AveragePrice
FROM Products
GROUP BY CategoryID
HAVING COUNT(*) >= 10;

HAVING을 이용하면 집계 결과에도 조건을 적용할 수 있습니다.


💡 잠깐! 이것도 알아두세요

실무에서는 통계를 계산할 때 대부분 별칭(Alias) 을 함께 사용합니다.

예를 들어

COUNT(*) AS ProductCount

처럼 작성하면

결과 표의 열 이름이

COUNT(*)

대신

ProductCount

로 표시됩니다.

보고서를 읽는 사람이 훨씬 이해하기 쉽습니다.


자주 하는 실수

① GROUP BY를 빼먹는다.

SELECT CategoryID,
       COUNT(*),
       AVG(Price)
FROM Products;

이 SQL은 오류가 발생하거나 원하는 결과가 나오지 않습니다.

CategoryID별 통계를 계산하려면 반드시 GROUP BY가 필요합니다.


② 집계 함수마다 SELECT를 따로 작성한다.

다음처럼 작성하는 학생이 많습니다.

SELECT COUNT(*) FROM Products;
SELECT AVG(Price) FROM Products;
SELECT MAX(Price) FROM Products;

가능은 하지만

한 번에 작성하면 훨씬 효율적입니다.


③ 별칭을 사용하지 않는다.

COUNT(*)

보다

COUNT(*) AS ProductCount

처럼 작성하는 것이 훨씬 읽기 쉽습니다.


④ ORDER BY에서 별칭을 사용하지 않는다.

다음과 같이 작성해도 됩니다.

ORDER BY AveragePrice DESC;

별칭을 사용하면 SQL이 더 간결해집니다.


실무에서는 어떻게 사용할까요?

회사에서는 여러 집계 함수를 함께 사용하여

  • 월별 매출 보고서
  • 부서별 급여 통계
  • 상품별 판매 현황
  • 국가별 고객 분석
  • 카테고리별 상품 분석

등 다양한 보고서를 작성합니다.

하나의 SQL로 여러 정보를 동시에 계산할 수 있기 때문에 업무 효율이 크게 향상됩니다.


실습

실습 1

카테고리별 상품 개수와 평균 가격을 조회하세요.

SELECT CategoryID,
       COUNT(*) AS ProductCount,
       AVG(Price) AS AveragePrice
FROM Products
GROUP BY CategoryID;

실습 2

카테고리별 최고 가격과 최저 가격을 조회하세요.

SELECT CategoryID,
       MAX(Price) AS HighestPrice,
       MIN(Price) AS LowestPrice
FROM Products
GROUP BY CategoryID;

실습 3

카테고리별 상품 개수, 가격 합계, 평균 가격을 조회하세요.

SELECT CategoryID,
       COUNT(*) AS ProductCount,
       SUM(Price) AS TotalPrice,
       AVG(Price) AS AveragePrice
FROM Products
GROUP BY CategoryID;

실무 미션

당신은 상품관리팀 직원입니다.

팀장님이 다음과 같이 요청했습니다.

"카테고리별 상품 현황을 보고 싶습니다."

 

다음 정보를 모두 출력하세요.

  • CategoryID
  • 상품 개수
  • 가격 합계
  • 평균 가격
  • 최고 가격
  • 최저 가격

그리고 평균 가격이 높은 순서대로 정렬하세요.

힌트)

COUNT(), SUM(), AVG(), MAX(), MIN(), ORDER BY를 함께 사용합니다.


핵심 정리

✔ 여러 집계 함수는 하나의 SELECT 문에서 함께 사용할 수 있다.

✔ GROUP BY를 사용하면 그룹별 통계를 한 번에 계산할 수 있다.

✔ ORDER BY와 함께 사용하면 보고서를 보기 좋게 정렬할 수 있다.

✔ HAVING을 이용하면 집계 결과에도 조건을 적용할 수 있다.

✔ 실제 업무에서는 여러 집계 함수를 함께 사용하는 경우가 가장 많다.


연습 문제

기본 문제

  1. 여러 집계 함수를 하나의 SELECT 문에서 사용할 수 있는 이유를 설명하세요.
  2. 집계 함수와 GROUP BY를 함께 사용하는 이유를 설명하세요.
  3. 별칭(Alias)을 사용하는 이유를 설명하세요.

응용 문제

  1. CategoryID별 상품 개수와 평균 가격을 조회하는 SQL을 작성하세요.
  2. CategoryID별 상품 개수, 최고 가격, 최저 가격을 조회하는 SQL을 작성하세요.
  3. 평균 가격이 높은 순서대로 출력하는 SQL을 작성하세요.

도전 문제

Products 테이블에서 다음 조건을 만족하는 보고서를 작성하세요.

  • CategoryID
  • 상품 개수
  • 가격 합계
  • 평균 가격
  • 최고 가격
  • 최저 가격

단,

  • 상품이 8개 이상인 카테고리만 출력하고,
  • 평균 가격이 높은 순서대로 정렬하세요.

다음 장 예고

지금까지 우리는 하나의 테이블 안에서 데이터를 조회하고 분석하는 SQL을 배웠습니다.

하지만 실제 데이터베이스에서는 고객, 주문, 상품처럼 정보가 여러 테이블에 나누어 저장되어 있습니다.

예를 들어 다음과 같은 질문은 하나의 테이블만으로는 해결할 수 없습니다.

"어떤 고객이 어떤 상품을 주문했나요?"

 

이처럼 여러 테이블의 정보를 연결하여 조회하는 기술이 바로 JOIN입니다.

다음 장부터는 SQL에서 가장 중요한 주제 중 하나인 JOIN의 세계로 들어가 보겠습니다.