[PostgreSQL] Aggregate functions & GROUP BY & HAVING

도톨이·2024년 2월 24일
1

SQL

목록 보기
3/19

Aggregate functions

Aggregate function 은 여러 입력을 받아 단일 출력을 반환하기 위한 함수이다.

Aggregate functions 에는 다음과 같은 종류가 있다.
AVG(), COUNT() , MAX(), MIN(), SUM()
하나씩 살펴보자.

MIN(), MAX()

MIN, MAX 함수를 사용하면 전체 데이터 중 해당하는 칼럼의 최소값, 최대값을 알 수 있다.

예를 들어 film 테이블에서 대체 비용의 최소값을 출력하려면 다음처럼 작성한다.

SELECT MIN(replacement_cost) FROM film;

만약, film 테이블에서 대체 비용의 최대값을 출력하려면 MAX() 로 적는다.

SELECT MAX(replacement_cost) FROM film;

둘 다 같이 할 수도 있다. 이떄는 film 테이블에서 대체 비용의 최소값과 최대값 칼럼 두개가 출력된다.

AVG(), ROUND()

AVG 를 사용하면 평균도 알 수 있다. film 테이블에서 대체 비용의 평균을 알 수 있다.

SELECT AVG(replacement_cost) FROM film;

이 때 너무 소수점이 길어지므로 원하는 자리수까지만 출력하려면 ROUND() 로 감싸서 소수점 자리수와 같이 적어주면 된다. 아래처럼 작성한다면 소수점 둘째자리까지만 표현할 수 있다.

SELECT ROUND(AVG(replacement_cost),2) FROM film;

SUM()

SUM 을 사용하면 전체 합을 얻을 수 있다. 아래 예시에서는 film 테이블에서 대체 비용의 총합을 알 수 있다.

SELECT SUM(replacement_cost) FROM film;

GROUP BY

GROUP BY 는 여러 행을 기준에 따라 그룹화하고 각 그룹에 대해 데이터가 어떻게 분포되어있는지 확인하기 위해 사용된다.

예를 들어 아래와 같은 테이블이 있다고 하자. 카테고리는 A, B, C 가 있는데 이들은 숫자가 아니라 범주형 자료이다. 이때 A는 A끼리 B는 B끼리 C는 C끼리 나눌 수 있을 것이다. 그룹별로 나눠서 집계함수를 실행하기 위해 GROUP BY 를 사용할 수 있다.

만약 각각에 대해 집계함수 COUNT() 를 적용한다면 A의 개수는 2개 B도 2개, C도 2개로 아래와 같은 결과가 나올 것이다.

SELECT category_col, AGG(data_col) FROM table GROUP BY category_col;

payment 테이블에서 어떤 고객이 가장 많은 돈을 썼는지 알아본다고 하자. payment 테이블에는 구매 고객 id 와 결제 금액이 있게 된다(+ 다른 칼럼들) 이때 고객 id 로 그루핑을 한 뒤 amount 의 합을 구하면 된다.
그리고 이것을 결제 금액의 합을 내림차순(DESC)으로 ORDER BY 하면 된다.

SELECT customer_id, SUM(amount) FROM payment
GROUP BY customer_id
ORDER BY SUM(amount) DESC;

만약 날짜별로 매출을 조회하려면 다음처럼 작성할 수 있다.

HAVING

SELECT company, SUM(sales)
FROM finance_table
WHERE company != 'Google'
GROUP BY company

결과에 대해 추가 필터링을 하고 싶을 때 having 을 통해 필터 추가가 가능하다.

SELECT company, SUM(sales)
FROM finance_table
WHERE company != 'Google'
GROUP BY company
HAVING SUM(sales) > 1000

을 실행하면 구글이 아닌 회사들로 필터링된 후 SUM(sales) 가 1000이상인 애들만 볼 수 있다.

아래 예시를 보면 customer id 로 GROUP BY 를 한 후에 합이 100이상인 것만 필터링을 했을 때 잘 실행된다.

profile
Computer Engineering

0개의 댓글

관련 채용 정보