SQL과 데이터베이스 - 조인과 집계 데이터 : GROUP BY절


GROUP BY절

이 학습은 패스트캠퍼스의 올인원 패키지 : 모두를 위한 SQL/DB 강의를 듣고 복습하는 내용입니다.

image

GROUP BY절 설명 및 특징

  • GROUP BY 절은 SELECT 문에서 반환된 행을 그룹으로 나눈다. 각 그룹에 대한 합계, 평균, 카운트 등을 계산할 수 있다.

GROUP BY절 문법

SELECT
	  COLUMN_1              -- GROUP BY 컬럼 기재
	  , 집계함수(COLUMN_2)   -- 집계함수 사용
 FROM
	  TABLE_NAME		 
GROUP BY COLUMN_1;	-- GROUP BY 절 기재, N개의 컬럼을 GROUP BY 하는 경우 ',' 구분,
					-- GROUP BY 절은 FROM 또는 WHERE절 바로 뒤에 나타나야 함

GROUP BY절 실습

  • 실습 테이블
SELECT * FROM PAYMENT;

image

  • 실습 1 (단순 group by)
-- 중복값이 제거된 customer_id를 추출
-- 1. GROUP BY 이용
SELECT
	  CUSTOMER_ID
  FROM
	  PAYMENT
GROUP BY CUSTOMER_ID;

-- 2. DISTINCT 이용
SELECT
	  DISTINCT CUSTOMER_ID
  FROM
	  PAYMENT;

image

=> PAYMENT 테이블은 원래 중복된(다수의) customer_id를 가질 수 있지만, group by절이나 distinct를 활용해서 중복을 제거할 수 있다.

  • 실습 2 (합계 구하기 + 정렬)
-- 거래액이 가장 많은 고객순으로 출력(3가지 방법 중 2번째 방법이 일반적, 숫자 넘버링은 추천하지 않음)

-- 1. alias를 이용하지 않고 order by 하는방법
SELECT
	  CUSTOMER_ID
	, SUM(AMOUNT) AS AMOUNT_SUM
  FROM
	  PAYMENT
GROUP BY CUSTOMER_ID
ORDER BY SUM(AMOUNT) DESC;

-- 2. alias를 이용하여 order by 하는방법
SELECT
	  CUSTOMER_ID
	, SUM(AMOUNT) AS AMOUNT_SUM
  FROM
	  PAYMENT
GROUP BY CUSTOMER_ID
ORDER BY AMOUNT_SUM DESC;

-- 3. 숫자 넘버링을 통한 order by
SELECT
	  CUSTOMER_ID
	, SUM(AMOUNT) AS AMOUNT_SUM
  FROM
	  PAYMENT
GROUP BY CUSTOMER_ID
ORDER BY 2 DESC;

image

=> customer 별 amount 합계를 내림차순 (거래액이 가장 많은 고객순)

=> alias를 지정해주었으면 활용하는 방법이 일반적이고, 넘버링은 헷갈릴 수 있기 때문에 추천하지 않는다.

​ * 실습 2를 통해 나온 결과를 통해 고객 정보 확인 (customer_id = 148)

SELECT * FROM CUSTOMER WHERE CUSTOMER_ID = 148;

image

  • 실습 3 (카운트 구하기)
-- 각 스텝이 몇 번의 결제를 처리했느냐?
SELECT
	  STAFF_ID ,
	  COUNT(PAYMENT_ID) AS COUNT
  FROM
	  PAYMENT
GROUP BY STAFF_ID;

image

​ * 이름까지 뽑고 싶을 때

SELECT * FROM STAFF;

image

=> 스태프는 2명

-- 1.
SELECT
	  A.STAFF_ID ,
	  B.STAFF_ID ,
	  B.FIRST_NAME ,
	  B.LAST_NAME ,
	  COUNT(A.PAYMENT_ID) AS COUNT
  FROM
	  PAYMENT A, STAFF B
  WHERE A.STAFF_ID = B.STAFF_ID
GROUP BY A.STAFF_ID, B.STAFF_ID, B.FIRST_NAME, B.LAST_NAME;

-- 2.
SELECT 
	  A.STAFF_ID ,
	  B.STAFF_ID ,
	  B.FIRST_NAME ,
	  B.LAST_NAME ,
	  COUNT(A.PAYMENT_ID) AS COUNT
  FROM
	  PAYMENT A, STAFF B
  WHERE A.STAFF_ID = B.STAFF_ID
GROUP BY A.STAFF_ID, B.STAFF_ID;

image


© 2021. All rights reserved.

----------Powered by Hydejack----------

kyusang Hwang