본문 바로가기
DB/DB 문법

GROUP BY와 집계 함수

by oneny 2023. 5. 15.
GROUP BY는 데이터를 분류하여 데이터가 어떤 범주에 어떻게 분포되는지를 이해하기 위해 데이터를 집계하는데 사용된다.

 

집계 함수

  • https://www.postgresql.org/docs/current/functions-aggregate.html
  • SQL은 다양한 집계 함수를 제공한다.
  • 집계 함수의 주요 아이디어는 여러 입력값을 가져와 하나의 출력값을 반환하는 것이다.
  • 가장 일반적인 집계 함수:
    • AVG() : 평균값을 반환
    • COUNT() : 값의 개수를 반환
    • MAX() : 최대값을 반환
    • MIN() : 최소값을 반환
    • SUM() : 모든 값의 합계를 반환
  • 집계 함수 호출은 SELECT 절이나 HAVING 절에서만 발생하낟.
  • 주의사항
    • AVG()는 소수점 이하 많은 자릿수의부동 소수점 값을 반환한다.
    • COUNT()는 단순히 행 수를 반환하는데, 관례적으로 COUNT(*)를 사용한다.

 

GROUP BY

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

GROUP BY를 사용하면 카테고리 별로 열을 집계할 수 있다.

 

SELECT category_col, AVG(data_col)
FROM table
WHERE category_col != 'A'
GROUP BY category_col;

GROUP BY 절은 반드시 FROM 또는 WHERE 문 바로 뒤에 와야 한다.

 

SELECT company, division, SUM(sales)
FROM finance_table
GROUP BY company, division;​

SELECT 문에서 열은 집계 함수를 가지거나 GROUP BY 호출에 있어야 한다. 위 예시처럼 SELECT 문에서 열에 집계 함수가 적용되어 있고, 다른 열을 불러오려면 GROUP BY에 포함되어야 한다!!

위 쿼리의 결과는 회사별 부서별 판매액의 총합이 된다.

 

SELECT company, division, SUM(sales)
FROM finance_table
WHERE division IN ('marketing', 'transport')
GROUP BY company, division;

GROUP BY로 그룹별 집계 함수를 구하는 경우를 제외하고는 WHERE 절로 한 번에 조건을 거는 것이 좋다.

 

SELECT company, SUM(sales)
FROM finance_table
GROUP BY company
ORDER BY SUM(sales);
SELECT DATE(payment_date), SUM(amount) FROM payment
GROUP BY DATE(payment_date)
ORDER BY SUM(amount) DESC;

WHERE 문에서 집계 결과를 참조해서는 절대 안된다. 결과를 필터링해야하는 경우라면 HAVING 문에서 해야 한다.

집계를 바탕으로 결과를 분류하려면 전체 함수를 참조해야 한다.

 

HAVING

HAVING은 집계 함수의 결과를 필터링하는데 사용되며, WHERE과 유사하다. WHERE 단일행을 필터링하는데 사용되고, HAVING은 집계된 결과 집합을 필터링하는데 사용된다.

 

SELECT column_1, AVG(column_2)
FROM table_name
GROUP BY column_1
HAVING condition;

HAVING 절은 집계가 수행된 이후에 자료를 필터링하기 때문에 GROUP BY 뒤에 있어야 한다.

 

SELECT customer_id, COUNT(*) as num_orders
FROM orders
GROUP BY customer_id
HAVING COUNT(*) >= 100;​

위 쿼리는 집계된 결과 중 100 이상의 주문 수를 가진 고객 검색이다.

 

-- WHERE 필터링을 적용하고 나서 GROUP BY를 호출한 후에
-- HAVING에 판매액 총액이 1,000 달러보다 큰 값을 조건으로 다시 필터링
SELECT company, SUM(sales)
FROM finance_table
WHERE company != 'Google'
GROUP BY company
HAVING SUM(sales) > 1000;

집계 결과는 WHERE 절이 실행된 이후 발생하기 때문에 WHERE를 사용하여 필터링할 수 없다.

 

SUM(sales)를 기준으로 필터링하고 싶다면?

  • 집계 함수는  SELECT 문의 열 목록에 명시되지만, 그룹화된 데이터에 적용된다.
  • 즉, GROUP BY 절에 지정된 열에 따라 결과가 그룹화되고, 집계 함수는 GROUP BY 절에 지정된 각 그룹별로 계산된다.
  • 따라서 GROUP BY 절 이후에 실행되기 때문에 WHERE 절에서 접근할 수 없다.

'DB > DB 문법' 카테고리의 다른 글

JOINS와 집합 연산자  (0) 2023.05.16
서브쿼리(Sub Query)  (1) 2023.05.16
시간 데이터 유형  (0) 2023.05.16
비교 연산자 및 기타  (1) 2023.05.15
SELECT  (0) 2023.05.15