본문 바로가기

Data Literacy/SQL

Chapter 2. JOIN을 이용한 데이터 조합 - (7) 집계 함수 : SUM, AVG, MIN, MAX

PostgreSQL logo image

 

 

앞서서 집계 함수 중 COUNT에 대해서 자세하게 살펴보았습니다. 지금부터는 집계함수 중 COUNT 이외의 것들에 대해서도 살펴보겠습니다. COUNT를 제외한 대표적인 집계 함수는 SUM, AVG, MIN, MAX가 있습니다. 가장 기본적인 사용법은 COUNT와 마찬가지로 파라미터에 집합(칼럼)을 넣는 형태로 사용하게 됩니다. 

 

또한 DISTINCT 사용 시에 살펴보았던 것처럼, 여기서도 집합 앞에 ALL 또는 DISTINCT를 붙여 중복 항목을 제거하거나 모두 표시할 수 있습니다. 

 

SUM( [ALL | DISTINCT] 집합명 )
AVG( [ALL | DISTINCT] 집합명 )
MIN( [ALL | DISTINCT] 집합명 )
MAX( [ALL | DISTINCT] 집합명 )

 

 

○ SUM : 합계 구하기

 

SUM은 말 그대로 합계를 구하는 집계함수입니다. '합계'를 구하는 형식이기 때문에, 이 SUM을 지정할 수 있는 집합(칼럼)은 수치형만 가능합니다. 예를 들어 문자, 날짜 시간 형태의 칼럼에서는 애초에 합계를 산출하는 것이 불가능하죠. 

 

dvdrental DB에서 PAYMENT 테이블을 활용해 보겠습니다. 여기에는 AMOUNT 칼럼이 있기 때문에 집계 함수 실습이 용히 하겠네요. 우선 PAYMENT 테이블을 전체 조회해 보겠습니다. 

 

select *
  from payment p

 

 

 

이제 이 테이블의 모든 행의 AMOUNT에 대한 합계 값을 구해보도록 하겠습니다.

 

select sum(amount)
  from payment p;

 

 

 

이를 통해서 AMOUNT의 모든 합계 값이 61,312.04 라는 것을 확인할 수 있습니다. 참고로 하나 명시해 두어야 할 것은, COUNT와 마찬가지로 NULL 값은 무시하고 계산한다는 점 입니다.

 

 

 


 

 

 

○ AVG : 평균 구하기

 

사실 AVG에도 크게 특별할 것은 없습니다. 집계 함수 AVG에 특정 칼럼을 지정해 주면 자동으로 평균값을 계산해주기 때문이죠. 한 가지 더 특이사항을 살펴보자면 집계함수 SUM과 COUNT를 사용하면 AVG 없이도 평균 값을 구할 수 있다는 점이 있습니다. 위에서 살펴본 PAYMENT 테이블의 AMOUNT를 사용해 알아보겠습니다.

 

select avg(amount),
       sum(amount)/count(amount)
from payment p

 

 

 

위에서 보는 바와 마찬가지로 AVG를 이용해 평균값을 구한 값과 SUM과 COUNT를 이용해 평균을 구한 값의 결과가 같다는 것을 확인할 수 있습니다. 

 

참고로 AVG 집계 함수 역시 NULL을 무시하기 때문에, NULL을 제외하고 평균 값을 계산하게 됩니다. 만일 평균 계산 시에 NULL을 '0'으로 취급하여 계산해야 한다면, CASE문을 사용해 아래와 같이 계산합니다. 

 

select avg(case when amount is null then 0 else amount end)
  from payment p

 

 

 

 

ㅇ MIN, MAX : 최댓값, 최솟값 구하기

 

MIN과 MAX 집계 함수의 경우 NULL을 무시한다는 기본 규칙은 다른 집계함수와 동일합니다. 다만, 이 두 집계함수의 경우에는 문자열과 날짜 시간 형에서도 사용이 가능합니다. 단순히 데이터 값 사이의 우열을 가리는 것은 가능하기 때문이지요. 

 

select max(amount), 
       min(payment_date)
  from payment p