[SQL] GROUP BY & HAVING

Hyunjun Kim·2024년 9월 25일
0

SQL

목록 보기
3/44

GROUP BY

SQL의 GROUP BY는 데이터를 특정 컬럼을 기준으로 그룹화하고, 그 그룹에 대해 집계 함수를 사용할 수 있게 해주는 기능입니다. 이를 통해 각 그룹별로 합계, 평균, 최대값, 최소값 등을 계산할 수 있습니다.

1. GROUP BY 사용법

GROUP BY 문은 보통 SELECT, FROM, WHERE 절 다음에 사용됩니다.

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE condition
GROUP BY column_name;

2. GROUP BY 활용 문제

2.1. sales 테이블에서 각 제품(product_id)별로 팔린 총 금액(total_sales)과 팔린 수량(sold_quantity)을 구하세요.

테이블 구조:

  • sales: 판매 데이터
    - sale_id: 판매 ID
    - product_id: 제품 ID
    - quantity: 판매 수량
    - 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;

2.2. orders와 customers 테이블을 사용하여, 각 도시(city)에서 주문을 한 고객(customer_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

HAVING 절은 그룹화된 데이터에 조건을 걸 때 사용하는 SQL 구문입니다. 주로 GROUP BY와 함께 사용되며, WHERE는 그룹화되기 전 행에 대한 필터링을 하는 반면, HAVING은 그룹화된 결과에 조건을 걸 수 있습니다.

1. HAVING 사용법

SELECT column_name, aggregate_function(column_name)
FROM table_name
GROUP BY column_name
HAVING condition;

2. HAVING 활용 문제

2.1.sales 테이블에서 각 제품(product_id)별로 팔린 총 금액(total_sales)이 5000 이상인 제품만 출력하세요.

테이블 구조:

  • sales: 판매 데이터
    - sale_id: 판매 ID
    - product_id: 제품 ID
    - quantity: 판매 수량
    - 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;

2.2. sales 테이블에서 제품별 팔린 수량이 100개 이상이면서, 총 판매 금액이 10,000 이상인 제품들을 구하세요.

테이블 구조:

  • sales: 판매 데이터
    - sale_id: 판매 ID
    - product_id: 제품 ID
    - quantity: 판매 수량
    - 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;

2.3. sales 테이블에서 제품별로 팔린 총 금액이 해당 제품의 평균 판매 금액보다 큰 제품들만 출력하세요.

테이블 구조:

  • sales: 판매 데이터
    - sale_id: 판매 ID
    - product_id: 제품 ID
    - quantity: 판매 수량
    - 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);

2.4. sales 테이블에서 제품별로 평균 판매 금액이 해당 제품의 최대 판매 금액의 절반 이상인 제품만 출력하세요.

테이블 구조:

  • sales: 판매 데이터
    - sale_id: 판매 ID
    - product_id: 제품 ID
    - quantity: 판매 수량
    - 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;

0개의 댓글