SQL : GROUP BY(이론, 실습)

정민·2024년 1월 21일

SQL

목록 보기
6/16

🍀 1.1 GROUP BY

  • 각각의 섹터별로 상장주식수의 합
  • GROUP BY 절은 한 개 이상의 컬럼을 기준으로 결과를 그룹화
  • 주로 SUM(), AVG(), COUNT(), MAX(), MIN() 등의 집계 함수와 결합되어 사용함

SELECT productline, count(productline)
FROM products
GROUP BY productline;

  • Products 테이블에서 productline별 정보의 수
  • 결과가 맞는지 확인해볼려면, 데이터를 보고 정렬해볼 것 (Trains 3개)
  • GROUP BY에 사용되는 열과 SELECT에 같은 열을 사용해줘야 정보를 얻기 쉬움

SELECT productcode, SUM(quantityordered)
FROM orderdetails
WHERE orderlinenumber =1
GROUP BY productcode;

  • orderdetails 테이블에서 orderlinenumber가 1인 제품들 중에서 productcode별 주문 수량의 합
  • WHERE구문 다음에 GROUP BY구문이 온다!

SELECT productline, MAX(msrp)
FROM products
GROUP BY productline

  • Products 테이블에서 productline별 최고 msrp(권장 판매 가격)




🍀 1.2 GROUP BY 실습


❔ 문제 1: orders 테이블에서 각 상태(status)별로 주문 개수를 구하라.

SELECT status, COUNT(orderNumber) AS OrderCount
FROM orders
GROUP BY status;

  • SUM은 수문 수량에 대해서 더해지는 것이고, COUNT는 주문의 개수임
  • AS 별칭은 안써도 되지만, 쓰면 컬럼명이 더 깔끔해짐

❔ 문제 2: orderdetails 테이블에서 각 제품 코드(productCode)별로 주문된 총 수량(quantityOrdered)를 구하라.

SELECT productCode, SUM(quantityOrdered) AS TotalOrdered
FROM orderdetails
GROUP BY productCode ;

  • 문제를 보면서 헷갈리다 싶으면, 데이터를 직접 살펴보는 게 도움이 됨

❔ 문제 3: products 테이블에서 제품 라인(productline)별 제품 개수를 조회하라.

SELECT productLine, COUNT(productCode) AS ProductCount
FROM products
GROUP BY productLine;

  • Primary Key(기본키, 노란키) : NULL이 안되고, 중복이 안됨
  • proudctline별로 제품이 몇개인지는 productName으로도 할 수 있는데, 이는 중복이 될 수도 있고 NULL값이 있을 수 있어 기본키인 productCode로 하는 것이 이상적.


❔ 문제 4: product 테이블에서 각 제품 라인(productline)별로 제품의 최대 가격(buyPrice)과 최소 가격(buyPrice)를 계산하라.

SELECT productLine, MAX(buyPrice) AS maxPrice, MIN(buyPrice) AS minPrice
FROM product
GROUP BY productLine;

  • 집계 함수는 2개 이상도 사용할 수 있음

❔ 문제 5: customers 테이블에서 각 고객 도시(city)별로 평균 크레딧 한도(creditlimit) 상위 5개를 조회하라.

SELECT city, AVG(creditLimit) AS avgCreditLimit
FROM customers
GROUP BY city 
ORDER BY avgCreditLimit DESC
LIMIT 5;

  • 상위 5개이므로 ORDER BY와 LIMIT가 들어감

❔ 문제 6: orderdetails 테이블에서 주문 번호(orderNumber)별로 총 주문 총액(priceEach * quantityOrdered) 상위 5개를 계산하라.

SELECT orderNumber, SUM(priceEach*quantityOrdered) AS totalOrderPrice
FROM orderdetails
GROUP BY orderNumber 
ORDER BY totalOrderPrice DESC
LIMIT 5;

  • 위 문제와 방식 동일
  • 가장 많은 매출을 일으켰던 주문이 뭔지 알 수 있음

❔ 문제 7: customers 테이블에서 각 국가(country)별로 고객 수가 많은 상위 5개를 조회하라.

SELECT country, COUNT(customerNumber) AS customerNumber
FROM customers
GROUP BY country 
ORDER BY customerNumber DESC
LIMIT 5;

❔ 문제 8: products 테이블에서 productScale이 '1:10'인 제품 라인(productline)별로 제품의 평균 가격(buyPrice)를 구하라.

SELECT productLine, AVG(buyPrice) AS avgPrice
FROM products
WHERE productScale = '1:10'
GROUP BY productLine
;

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

0개의 댓글