-
728x90
GROUP BY절
SQL에서 GROUP BY절은 같은 값을 가진 행들을 그룹 지어준다.
GROUP BY절은 aggregate 함수를 하나 이상의 결과로 그룹 짓기 위해 같이 자주 사용된다.
GROUP BY의 기본 문법은 다음과 같다.
SELECT column_name FROM table_name WHERE condition GROUP BY column_name ORDER BY column_name;
위처럼 GROUP BY절은 FROM, 혹은 WHERE문 다음에 위치해야 한다.
GROUP BY 주의 할 점
SELECT문과 GROUP BY
SELECT문에서 컬럼은 반드시 aggregate 함수를 가지고 있거나 GROUP BY절 안에 위치하고 있어야 한다.
SELECT company, division, SUM(sales) FROM finance_table GROUP by company, division;
WHERE문과 Aggregation 함수
WHERE문은 절대 aggregation 함수의 결과를 참조하면 안 된다.
대신 나중에 배울 HAVING절을 aggregation과 사용할 수 있다.
SELECT company, division, SUM(sales) FROM finanace_table WHERE division IN ('marketing', 'transport') GROUP BY company, division;
ORDER BY와 Aggregation 함수
만약 aggregate 함수의 값을 기반으로 정렬하고 싶다면, ORDER BY를 사용할 때 아래처럼 함수 전체를 참조해야 한다.
SELECT company, SUM(sales) FROM finance_table GROUP BY company ORDER BY SUM(sales) LIMIT 5;
GROUP BY 사용하기
우선 한번 payment라는 테이블에서 GROUP BY를 단순히 사용해보자.
SELECT customer_id FROM payment GROUP BY customer_id;
고객이 결제할 때마다 쌓이는 결제 테이블에서 위 같은 요청을 보내면 유저당 주문이 여러 개라도 고객 id가 하나씩 조회될 것이다. 이렇게 사용하면 SELECT DISTINCT와 같은 기능이 된다.
다음으로는 위 구조에서 유저당 총 주문금액(sum)이 얼마인지를 조회해보자.
SELECT customer_id, SUM(amount) FROM payment GROUP BY customer_id ORDER BY SUM(amount) DESC;
위와 같이 요청을 보낼 때, 유저는 distinct 하게, 즉 하나씩 출력이 되고 유저 당 총 주문 금액이 같이 표시된다 (다시 한번 aggregation 함수와 ORDER BY를 사용할 때 함수 전체를 참조해야 하는 것을 잊지 말자).
SUM뿐만 아니라 COUNT 등 다른 집계 함수도 사용이 가능하다.
더 나아가서 고객 아이디, 그리고 결제를 받은 스태프 아이디 당 총 결제 금액을 조회하는 쿼리를 요청해보자.
SELECT customer_id, staff_id, SUM(amount) FROM payment GROUP BY staff_id, customer_id ORDER BY staff_id, customer_id DESC;
위 같은 요청에서, 스태프 아이디, 그리고 고객 아이디 당 총 주문 금액을 확인할 수 있게 되고, 정렬 또한 가능한 것을 확인할 수 있다.
728x90'Back-end > SQL' 카테고리의 다른 글
SQL AS 키워드 (0) 2021.06.01 SQL HAVING절 (0) 2021.05.31 SQL Aggregate 함수 (AVG, COUNT, MAX, MIN, SUM) (0) 2021.05.31 SQL LIKE & ILIKE연산자 (0) 2021.05.30 SQL IN 연산자 (0) 2021.05.30 댓글