SQL : GROUP BY(HAVING), IF/CASE

정민·2024년 1월 22일

SQL

목록 보기
8/16

목차
1. GROUP BY구문(SQL에서 가장 중요)
HAVING
2. IF/CASE
3. JOIN



🍀 1. HAVING 구문


HAVING절은 SQL의 GROUP BY절과 함께 사용되며 그룹화된 결과에 조건을 적용하는 데 사용함.

  • WHERE절과 차이점
    WHERE절은 개별 테이블에 대한 조건을 적용하는 반면, HAVING절은 그룹화된 결과의 집계값에 대한 조건을 적용함
# SQL Code 처리 순서
SELECT 컬럼
FROM 테이블
WHERE 조건
GROUP BY 조건
HAVING 조건
ORDER BY 조건

HAING : 그룹화 조건 확인
항상 GROUP BY 뒤에 위치하며 GROUP BY 이후 그룹화 된 테이블에 조건 적용

SELECT productline, COUNT(productline)
FROM products
GROUP BY productline
HAVING COUNT(productline) > 20 ;

  • 최종적으로 나온 결과에서 20보다 큰 것을 보고 싶음
  • Products 테이블에서 productLine별 정보의 수가 20미만
  • HAVING 컬럼명이 SELECT에서 사용한 컬럼명과 같아야 함 (별칭 사용 시 별칭으로)

SELECT productline, avg(buyprice)
FROM products
GROUP BY productline
HAVING avg(buyprice) < 50;

  • Products 테이블에서 productLine 평균 가격이 $50미만

SELECT productcode, SUM(quantityordered)
FROM orderdetails
WHERE orderlinenumber = 1
GROUP BY productcode
HAVING productcode LIKE 'S10%'
;

  • orderdetails 테이블에서 orderlinenumber가 1인 제품들 중에서 productcode가 s10으로 시작하는 주문 수량의 합
  • WHERE - GROUP BY - HAVING
  • 집계화하기 전에 이전 테이블에 WHERE구문써서 정렬 - GROUP BY구문으로 집계 - 집계된 데이터들에 HAVING구문으로 데이터 추리기

실습

❔ 문제 1: orders 테이블에서 연도별 주문 건수가 100건을 초과하는 연도를 조회하라 (orderDate와 orderNumber 컬럼 사용)

SELECT YEAR(orderDate) AS OrderYear, COUNT(orderNumber) AS TotalOrders
FROM orders
GROUP BY YEAR(orderDate)
HAVING TotalOrders > 100
;

  • 연도 뽑기 : YEAR(날짜형 컬럼) # MONTH, DAY

❔ 문제 2: orderdetails 테이블에서 상품별 총 주문량이 500개 이상인 상품코드를 조회하라(productCode와 quantityOrdered 컬럼 사용)

SELECT productCode, SUM(quantityOrdered)
FROM orderdetails
GROUP BY productCode
HAVING SUM(quantityOrdered) >= 500
;

❔ 문제 3: payments 테이블에서 고객별 총 결제 금액이 $150,000을 초과하는 고객 번호를 조회하라 (customerNumber와 amount 컬럼 사용)

SELECT customerNumber, SUM(amount)
FROM payments
GROUP BY customerNumber
HAVING SUM(amount) > 150000
;

  • customerNumber 고객별 amount를 sum하면 됨

❔ 문제 4: customers 테이블에서 국가별 고객 수가 10명 이상인 국가를 조회하라 (country와 customerNumber 컬럼 사용)

SELECT country, COUNT(customerNumber) AS totalcustomer
FROM customers
GROUP BY country
HAVING totalcustomer >= 10
;



🍀 2. IF/CASE 구문


IF 구문

  • IF(condition, value_if_true, value_if_false)
SELECT checkNumber, amount, IF(amount > 50000, 'Large', 'Samll') AS orderSize
FROM payments
;

  • select구문에서 if구문이 사용됨
  • payments 테이블에서 amount가 50000초과인 경우 large, 이하인 경우 small로 출력. 별칭으로 orderSize (별칭없을 시 if 그대로 출력)

실습

❔ 문제 5: products 테이블을 사용하여 상품별로 가격이 $100을 초과하면 Expensive로, 그렇지 않으면 Cheap으로 표시하는 쿼리를 작성하라 (products.productName, products.buyPrice 컬럼 사용)

SELECT productName, buyPrice, IF(buyPrice >100, 'Expensive', 'Cheap') AS category
FROM products
ORDER BY buyPrice desc
;

  • 테이블.컬럼 (테이블안의 컬럼)



CASE구문

CASE문은 여러 조건을 테스트하고 여러 결과 중 하나를 반환

CASE expression
WHEN value1 THEN result1
WHEN value2 THEN result2
...
ELSE result
END as ~
SELECT productName, buyPrice,
CASE
WHEN buyPrice < 20 THEN 'Cheap'
WHEN buyPrice BETWEEN 20 AND 50 THEN 'Moderate'
ELSE 'Expensive'
END AS priceCategory
FROM products;

  • buyPrice의 분류에 따라 cheap, moderate, expensive
  • select구문 안에 case라는 컬럼이 들어갔다 라고 생각하면 좋음
  • END : CASE ~ END는 한몸. END AS 별칭

실습

❔ 문제 6: employees 테이블을 사용하여, 각 직원의 직책(jobTitle)에 따라 다음과 같이 분류하라. (Sales Rep : Sales Team, VP Sales : Management, VP Marketing : Management, 그 외 : Other Positions)

SELECT firstName, lastName, jobTitle,
    case jobTitle
        WHEN 'Sales Rep' THEN 'Sales Team'
        WHEN 'VP Sales' THEN 'Management'
        WHEN 'VP Marketing' THEN 'Management'
        ELSE 'Other Positions'
    END AS PositionCategory
FROM employees;

profile
데이터 공부하는 예비 데이터 분석가, 김정민입니다.

0개의 댓글