GBEY
[SQL] 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:
- 총액 기준 가장 많은 금액을 사용한 고객은 누구인가?
amount의 총합을 기준으로 내림차순 정렬하면
금액을 많이 사용한 순으로 볼 수 있다.
>> 가장 일반적인 GROUP_BY 쿼리!
SELECT customer_id, SUM(amount)
FROM payment
GROUP BY customer_id
ORDER BY SUM(amount) DESC;
output:
- 위 예제를 여러가지 열과 함께 보고싶다면?
>> 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만큼을 거래했음
- 위 결과를 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:
- 거래 금액이 가장 높은 날짜는?
>> DATE 함수는 타임스탬프 중 시, 분, 초 제외하고 날짜만 보여줌
SELECT DATE(payment_date), SUM(amount) FROM payment
GROUP BY DATE(payment_date)
ORDER BY SUM(amount) DESC;
output:
'데이터분석' 카테고리의 다른 글
[SQL] JOIN - INNER JOIN이란? (0) | 2023.08.24 |
---|---|
[SQL] AS문이란? + pgAdmin에서 연습하기 (0) | 2023.08.24 |
[SQL] HAVING이란? + pgAdmin으로 연습하기 (0) | 2023.08.24 |
[SQL] 기초 복습 - 집계 함수의 정의, 특징, 사용법 (1) | 2023.08.23 |
[통계학] 기초통계 복습 #1 - 변수, 분포, 평균 등 (1) | 2023.08.20 |