SQL의 GROUP BY는 데이터를 특정 컬럼을 기준으로 그룹화하고, 그 그룹에 대해 집계 함수를 사용할 수 있게 해주는 기능입니다. 이를 통해 각 그룹별로 합계, 평균, 최대값, 최소값 등을 계산할 수 있습니다.
GROUP BY 문은 보통 SELECT, FROM, WHERE 절 다음에 사용됩니다.
SELECT column_name, aggregate_function(column_name) FROM table_name WHERE condition GROUP BY column_name;
sales
테이블에서 각 제품(product_id)별로 팔린 총 금액(total_sales)과 팔린 수량(sold_quantity)을 구하세요.테이블 구조:
sales
: 판매 데이터sale_id
: 판매 IDproduct_id
: 제품 IDquantity
: 판매 수량price_per_unit
: 단위 가격SELECT product_id, SUM(quantity * price_per_unit) AS total_sales, SUM(quantity) AS sold_quantity FROM sales GROUP BY product_id;
테이블 구조:
orders
: 주문 정보
- order_id
: 주문 ID
- customer_id
: 고객 ID
- order_date
: 주문 날짜
- city
: 주문한 도시
- order_amount
: 주문 금액
customers
: 고객 정보
- customer_id
: 고객 ID
- customer_name
: 고객 이름
SELECT city, COUNT(DISTINCT customer_id) AS customer_count, MAX(order_date) AS last_order_date FROM orders GROUP BY city;
HAVING 절은 그룹화된 데이터에 조건을 걸 때 사용하는 SQL 구문입니다. 주로 GROUP BY와 함께 사용되며, WHERE는 그룹화되기 전 행에 대한 필터링을 하는 반면, HAVING은 그룹화된 결과에 조건을 걸 수 있습니다.
SELECT column_name, aggregate_function(column_name) FROM table_name GROUP BY column_name HAVING condition;
테이블 구조:
sales
: 판매 데이터sale_id
: 판매 IDproduct_id
: 제품 IDquantity
: 판매 수량price_per_unit
: 단위 가격SELECT product_id, SUM(quantity * price_per_unit) AS total_sales FROM sales GROUP BY product_id HAVING SUM(quantity * price_per_unit) >= 5000;
테이블 구조:
sales
: 판매 데이터sale_id
: 판매 IDproduct_id
: 제품 IDquantity
: 판매 수량price_per_unit
: 단위 가격SELECT product_id, SUM(quantity) AS sold_quantity, SUM(quantity * price_per_unit) AS total_sales FROM sales GROUP BY product_id HAVING SUM(quantity) >= 100 AND SUM(quantity * price_per_unit) >= 10000;
테이블 구조:
sales
: 판매 데이터sale_id
: 판매 IDproduct_id
: 제품 IDquantity
: 판매 수량price_per_unit
: 단위 가격SELECT product_id, SUM(quantity * price_per_unit) AS total_sales FROM sales GROUP BY product_id HAVING SUM(quantity * price_per_unit) > (SELECT AVG(quantity * price_per_unit) FROM sales);
테이블 구조:
sales
: 판매 데이터sale_id
: 판매 IDproduct_id
: 제품 IDquantity
: 판매 수량price_per_unit
: 단위 가격SELECT product_id, AVG(quantity * price_per_unit) AS avg_sales, MAX(quantity * price_per_unit) AS max_sales FROM sales GROUP BY product_id HAVING AVG(quantity * price_per_unit) >= MAX(quantity * price_per_unit) / 2;