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

    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

    댓글