반응형
Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

GBEY

[SQL] GROUP BY란? + pgAdmin으로 연습하기 본문

데이터분석

[SQL] GROUP BY란? + pgAdmin으로 연습하기

리스보아 2023. 8. 24. 12:08
반응형

GROUP BY

 

 

👀 목차

GROUP BY란?

pgAdmin에서 GROUP_BY 연습하기

 

 

 

👀 GROUP BY란?

 

- 카테고리 열에 GROUP BY를 실행함

- 카테고리 열의 값은 연속적인 값이 아님

- 카테고리 열의 값이 연속적이 아니라 해도 숫자로 분류될 수 있음

Ex) 크루즈의 객실 등급 - Class1, Class2, Class3, ...

 

 

GROUP BY의 역할?

- 지정한 카테고리 열을 기준으로 테이블의 데이터를 분류할 수 있다

Category Data Value
A 10
A 5
Category Data Value
B 2
B 4
Category Data Value
C 12
C 6

 

- GROUP BY와 함께 SUM을 사용한다면 카테고리별 합계를 구할 수 있음

Category Result
A 15
B 6
C 18

- AVG를 쓰면 평균, COUNT를 쓰면 갯수 ...

 

 

 

일반적인 GROUP BY 쿼리?

GROUP BY는 FROM이나 WHERE의 바로 다음에 와야함

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

 

WHERE과 함께 GROUP BY 쓰기

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

 

 

중요!

 

1)

GROUP_BY문을 사용할 때 어떤 열을 SELECT 하는 경우

그 열에 집계 함수를 사용하거나

GROUP_BY문에 꼭 그 열을 포함시켜야함

 

2)

WHERE문에 집계함수의 결과를 참조해서는 안됨

= WHERE문에 집계함수의 대상을 넣으면 안됨

-> HAVING 의 역할임

 

3)

집계함수의 결과를 바탕으로 정렬을 하고싶다면 전체 함수를 참조해야함 -> ??

SELECT company, SUM(sales)
FROM finance_table
GROUP BY company
ORDER BY SUM(sales)
LIMIT 5;

 

 

 

👀 pgAdmin에서 GROUP_BY 연습하기

 

- payment 테이블에서 customer_id로 그룹화 하기

 >> SELECT DISTINCT customer_id FROM payment; 와 같음!

SELECT customer_id 
FROM payment
GROUP BY customer_id;

output: 

payment 테이블에서 customer_id로 그룹화하는 sql 실행 결과 이미지

 

 

- 총액 기준 가장 많은 금액을 사용한 고객은 누구인가?

amount의 총합을 기준으로 내림차순 정렬하면

금액을 많이 사용한 순으로 볼 수 있다.

>> 가장 일반적인 GROUP_BY 쿼리!

SELECT customer_id, SUM(amount)
FROM payment
GROUP BY customer_id
ORDER BY SUM(amount) DESC;

output:

payment 테이블에서 총액 기준 가장 많은 금액을 사용한 고객을 구하는 sql 실행 결과 이미지

 

 

- 위 예제를 여러가지 열과 함께 보고싶다면?

  >> SELECT문과 GROUP BY에 원하는 열을 적어주기

SELECT customer_id, staff_id, SUM(amount)
FROM payment
GROUP BY staff_id, customer_id
ORDER BY customer_id;

output:

해석) 1번 고객은 2번 스태프와 53.85만큼을 거래했고 1번 스태프와 60.85만큼을 거래했음

 

payment 테이블에서 총액 기준 가장 많은 금액을 사용한 고객을 여러 열들과 함께 구하는 sql 실행 결과 이미지

 

 

- 위 결과를 staff_id, customer_id 순으로 정렬하고 싶다면?

 >> GROUP BY 순서가 아니라 SELECT문에 순서대로 적어주기

 >> ORDER BY 순서도 staff_id, customer_id 순으로 적어야 스태프별 거래 내역을 더 명확히 볼 수 있음

 >> 보통 SELECT와 GROUP_BY의 순서를 동일하게 하고 ORDER BY는 질문에 따라서 달라짐

 

SELECT staff_id, customer_id, SUM(amount)
FROM payment
GROUP BY staff_id, customer_id
ORDER BY staff_id, customer_id;

output:

payment 테이블에서 총액 기준 가장 많은 금액을 사용한 고객을 staff_id와 함께 그룹화 하고 정렬한 sql 실행 결과 이미지

 

 

 

- 거래 금액이 가장 높은 날짜는?

 >> DATE 함수는 타임스탬프 중 시, 분, 초 제외하고 날짜만 보여줌

 

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

output:

payment 테이블에서 거래금액이 가장 높은 날짜를 구하는 sql 실행 결과 이미지

 

 

 

반응형