데이터분석 과정/SQL

SQL | Group By절과 집계 함수는 한 세트 | 집계 함수 사용 시 주의 사항

ANNASENA 2024. 1. 5. 22:33
728x90

 

0. Group by절과 집계함수의 연관성

 

Group by절을 사용하는 이유카테고리 별데이터들을 모아보고 싶기 때문일 것이다.

그런데 Group by로 카테고리를 묶게되면 필연적으로 해당 카테고리에 속했던 데이터의 값들도 합해질 수밖에 없다.

이 데이터의 값들을 합할 때(집계할 때) 우리는 각 값을 셀 건지, 더할 건지, 평균을 낼 건지 정해야 한다.

이 때 집계함수 COUNT, SUM, AVG, MIN, MAX함수 등이 사용된다. 

※ 단, Group by절을 사용할 때 집계함수가 쓰이는 것은 맞지만, 집계함수가 꼭 Group by가 있을 때만 쓰이는 것은 아님!

 

Group by절과 집계함수는 쿼리문에서 어떻게 이용되는지 좀 더 자세히 알아보자.

 


1. Group By 

 

▶ Group by절의 기본 구조

SELECT 카테고리컬럼(원하는컬럼 아무거나),
       집계함수(계산 컬럼)
FROM 테이블명
WHERE 조건식
Group By 카테고리컬럼(원하는컬럼 아무거나)
Having 그룹조건식

 

 

▶ Group by절 / 집계함수/ Having절 사용법 및 참고사항

 

Group by절

  • Group by절로 카테고리 별 기준을 정한 뒤, SELECT절에서 기준이 된 컬럼과 집계함수 적용된 값 조회.
  • Group by 뒤에 컬럼명을 다 적을 수도 있지만 Group by 1, 2 로 적을 수도 있음. 
  • 여기서 1, 2의 의미는 SELECT절의 첫 번째 컬럼과 두 번째 컬럼을 기준으로 그룹화할 것이라는 의미
  • 1 이렇게 하나만 적어도 됨. 그럼 SELECT절의 첫 번째 컬럼을 기준으로 그룹화할 것이라는 의미

 

집계 함수

 

[TIL] WHERE 절과 집계함수? 그런 거 없음

엣지 퀘스천으로 인생을 살아가는 새럼.. 오늘도 이런 것에 딴지를 걸었다.

velog.io

 

 

  • 또 쿼리문 시행 순서 상 Group by절보다 WHERE절이 먼저 수행되기 때문에 집계함수를 사용할 수 있는 Group by절이 전체 데이터를 그룹으로 나누기도 전에 WHERE절이 (자신의 조건에 따라) 행들을 미리 제거해버림.
  • Group by로 그룹화 된 데이터에 조건을 주고 싶으면 Having절에 집계함수 사용 가능. Having절에서는 집계함수를 사용할 수 있음.
  • 집계함수의 통계 정보는 NULL 값을 가진 행을 제외하고 수행함.

예를 들어 ,

학생 점수
A 55
B 75
C NULL

 

여기서 학생 A, B, C의 점수 값 평균(AVG함수)을 구하면,

 

①  (55 + 75 + ?) / 3

②  (55 + 75) / 2

 

둘 중에 정답은..?!?!

이미 위에 설명해놨지만 정답은.... 페이지 마지막에 (^-^)b

 

Having절

  • Group by절의 뒤에 위치하며, Group by로 [이미 그룹화되어 집계된 데이터]에 대한 조건을 걸 때 사용. 

 


 

2. 실습 문제

 

2-1) 음식 종류 별 주문 금액 합계

- 컬럼명: cuisine_type(음식 타입)과 price(주문 금액) 이용

 

 

▶ cuisine_type(음식 타입) 별로 그룹화한 뒤 각 카테고리 안의 주문 금액 값들을 다 더해줌.

SELECT cuisine_type , 
       sum(price)
FROM food_orders fo 
Group By cuisine_type

 


 

2-2) 음식점별 주문 금액 최댓값 조회하기

cuisine_type(음식 타입) 별로 그룹화한 뒤 각 카테고리 안의 주문 금액 값들 중 최댓값을 조회함.

SELECT cuisine_type , 
       MAX(price)
FROM food_orders fo 
Group By cuisine_type

 


 

2-3) 결제 타입별 가장 최근 결제일 조회하기

- 컬럼명: pay_type(결제 타입)과 date(날짜) 이용

 

 

▶ pay_type(결제 타입) 별로 그룹화한 뒤 각 카테고리 안의 날짜들 중 가장 최근날짜를 조회함.

: 가장 최근 날짜를 구하려면 MAX 함수를 이용해야 함. 시간이 지날수록 날짜는 점점 커지기 때문이라고 생각하자. 2023년, 2024년, 2025년  ...  2099년 (? 급발진)

SELECT pay_type ,
       MAX(date)
FROM payments p 
Group By pay_type

 


 

2-4) 이메일 도메인 별 고객 수와 평균 연령 구하기

 

(참고) 이 데이터에서는 email 컬럼의 데이터 값을 @(도메인) 앞의 글자 수 = 9글자가 되도록 동일하게 맞춰놓음.

SELECT SUBSTR(email, 10) email_domain, 
       COUNT(customer_id) count_customer,
       AVG(age) avg_age
FROM customers c 
Group By SUBSTR(email, 10)

 

 

Q. 그렇다면 @앞의 아이디 글자 수가 제각각일 경우에는 어떤 쿼리문을 짜야 도메인만 뽑아낼 수 있을까??

: 내가 나에게 내는 숙제.. 해결하면 게시글 올리고, 링크 걸어두러 다시 오겠습니다요~

.

.

.

[드디어 해결!]

[IT 교육/SQL] - SQL | REPLACE / SUBSTR / SUBSTRING_INDEX / CONCAT 함수 정리 + 실습 문제

 

SQL | REPLACE / SUBSTR / SUBSTRING_INDEX / CONCAT 함수 정리 + 실습 문제

0. SQL 쿼리문 짤 때 알면 유용한 함수 SQL에도 엑셀 함수같은 기능이 있다. 이번에는 문자열 데이터 값들을 바꿔주고, 추출하고, 이어주는 함수에 대해 자세히 알아보자. + SUBSTR 함수에 대해서는 SU

nasena.tistory.com


*정답: ②


 

[참고 게시글]

Q. [Group by절의 집계함수]와 [윈도우 함수]의 공통점은 뭘까요?

[IT 교육/SQL] - SQL | 윈도우 함수(Window Function) 사용법 정리 | RANK함수, SUM함수

 

SQL | 윈도우 함수(Window Function) 사용법 정리 | RANK함수, SUM함수

0. 윈도우 함수(Window Function)는 다중행 함수 ▶ 다중 행 함수(Multi-Row Function) : 여러 행의 그룹에 대해 적용되는 함수 ▶ 다중 행 함수의 종류(그룹함수, 윈도우 함수) 1) 그룹함수 (집계함수, 고급

nasena.tistory.com

 

728x90