본문 바로가기
Database/MySQL

그룹지어 통계내기 (GROUP BY)

by 컴돈AI 2024. 3. 2.

목차

GROUP BY

  • 어떤 카테고리별로 묶어서 통계(집계 함수)를 내고 싶을 때 사용하는 것이 GROUP BY 입니다.
    • 예를 들어 고객등급이 'VIP'인 사람들끼리의 평균, '패밀리'인 사람들끼리의 평균, '로열'인 사람들끼리의 평균을 따로따로 구해야 할 경우 유용합니다.
  • 예시
    • GROUP BY를 사용하지 않을 경우
      • SELECT AVG(사용금액) FROM card WHERE 고객등급='vip';
        SELECT AVG(사용금액) FROM card WHERE 고객등급='패밀리';
        SELECT AVG(사용금액) FROM card WHERE 고객등급='로열';
    • GROUP BY를 사용한 경우
      • 위에서 한 작업을 한 번에 처리가 가능합니다. (모든 고객등급에 대하여 처리가능)
      • SELECT 고객등급, AVG(사용금액) FROM card GROUP BY 고객등급
        • 보통 GROUP BY 한 컬럼을 제일 앞에 써줍니다.

HAVING

  • GROUP BY를 통해서 해당 컬럼의 카테고리별로 통계를 냈습니다. 하지만 해당 컬럼의 모든 카테고리에서 통계를 내고 싶지 않고, 조건식을 걸어 필터링을 하고 싶을 때는 어떻게 해야 할까요?
    • GROUP BY에 대한 필터링은 WHERE을 사용하는 것이 아닌 HAVING을 사용해야 합니다.
      • WHERE : SELECT FROM 결과 필터링
      • HAVING : GROUP BY 결과 필터링
  • HAVING만 단독으로 AS로 지정한 컬럼명으로 다음과 같이 사용할 수도 있습니다.
    • SELECT 결제횟수 ASFROM card HAVING>50
    • WHERE로 대신해서 작성할 경우 오류가 발생합니다.
      • 오류발생
      • SELECT 결제횟수 ASFROM card WHERE>50
  • 예시
    • VIP와 패밀리 고객등급을 대상으로 고객등급별로 평균 사용금액을 구하시오 
      • SELECT 고객등급, AVG(사용금액) FROM card GROUP BY 고객등급 HAVING 고객등급='vip' OR 고객등급='패밀리'

SQL문 작성순서

  • SELECT / FROM / WHERE / GROUP BY / HAVING / ORDER BY 순으로 작성

예제

  • card 테이블에서 연체 횟수마다 몇 명이 있는지 출력해 보기 (연체 횟수 기준 정렬)
    • SELECT 연체횟수, count(*) AS 인원 FROM card GROUP BY 연체횟수 ORDER BY 연체횟수
  • 위 결과에서 인원이 1명 이하인 행은 안 보이게 필터링하기
    • SELECT 연체횟수, count(*) AS 인원 FROM card GROUP BY 연체횟수 HAVING 인원>1 ORDER BY 연체횟수
  • card 테이블에서 회원등급별로 최대사용금액과 최소사용금액이 몇 배나 차이나는지 구해보기
    • SELECT 고객등급, max(사용금액) AS 최대, min(사용금액) AS 최소, max(사용금액)/min(사용금액) AS 몇배 FROM card 
      GROUP BY 고객등급
      ORDER BY 고객등급;

출처