[SQL] 1-5. 조건에 따라 그룹으로 묶기

chxxrin·2024년 4월 1일
0

sql

목록 보기
2/5

1. GROUP BY - 조건에 따라 집계된 값을 가져옵니다.

→ 겹치지 않게 모두 가져올 수 있음

SELECT Country 
FROM Customers
GROUP BY Country;
SELECT CategoryID 
FROM Products
GROUP BY CategoryID;

💡 여러 컬럼을 기준으로 그룹화할 수도 있습니다.

SELECT 
  Country, City,
  CONCAT_WS(', ', City, Country)
FROM Customers
GROUP BY Country, City;

📚 그룹 함수 활용하기

SELECT
  COUNT(*), OrderDate
FROM Orders
GROUP BY OrderDate;
COUNT(*)OrderDate
11996-07-04
11996-07-05
21996-07-08
SELECT
  ProductID,
  SUM(Quantity) AS QuantitySum
FROM OrderDetails
GROUP BY ProductID
ORDER BY QuantitySum DESC;
ProductIDQuantitySum
601577
591496
SELECT
  CategoryID,
  MAX(Price) AS MaxPrice, 
  MIN(Price) AS MinPrice,
  TRUNCATE((MAX(Price) + MIN(Price)) / 2, 2) AS MedianPrice,
  TRUNCATE(AVG(Price), 2) AS AveragePrice
FROM Products
GROUP BY CategoryID;

→ TRUNCATE(, 2) : 소수점 둘째자리까지 가능하도록

CategoryIDMaxPriceMinPriceMedianPriceAveragePrice
1263.504.50134.0037.97
243.9010.0026.9523.06
381.009.2045.1025.16
SELECT 
  CONCAT_WS(', ', City, Country) AS Location,
  COUNT(CustomerID)
FROM Customers
GROUP BY Country, City;
LocationCOUNT(CustomerID)
Buenos Aires, Argentina3
Graz, Austria1

💡 WITH ROLLUP - 전체의 집계값, 총합

  • 위의 각 집계함수 쿼리 끝에 WITH ROLLUP 을 추가해보세요.
  • ⚠️ ORDER BY 와는 함께 사용될 수 없습니다.
SELECT
  Country, COUNT(*)
FROM Suppliers
GROUP BY Country
WITH ROLLUP;
CountryCOUNT(*)
Australia2
Brazil1

HAVING - 그룹화된 데이터 걸러내기, 조건문

💡 WHERE는 그룹하기 전 데이터, HAVING은 그룹 후 집계에 사용합니다.

→ 즉, HAVING은 그룹화를 한 다음에 걸러내는 것이고, WHERE은 그룹화하기 전에 미리 걸러내는 것!

1-3 복습 - 💡 그룹 함수

⭐ NULL값은 집계하지 않습니다.

함수설명
MAX가장 큰 값
MIN가장 작은 값
COUNT갯수 (NULL값 제외)
SUM총합
AVG평균 값
SELECT
  Country, COUNT(*) AS Count
FROM Suppliers
GROUP BY Country
HAVING Count >= 3;

→ Country로 묶음!

CountryCount
France3
Germany3
USA4
SELECT
  COUNT(*) AS Count, OrderDate
FROM Orders
WHERE OrderDate > DATE('1996-12-31')
GROUP BY OrderDate
HAVING Count > 2;
CountOrderDate
31997-12-16
31997-12-18
31997-12-22
SELECT
  CategoryID,
  MAX(Price) AS MaxPrice, 
  MIN(Price) AS MinPrice,
  TRUNCATE((MAX(Price) + MIN(Price)) / 2, 2) AS MedianPrice,
  TRUNCATE(AVG(Price), 2) AS AveragePrice
FROM Products
WHERE CategoryID > 2
GROUP BY CategoryID
HAVING
  AveragePrice BETWEEN 20 AND 30
  AND MedianPrice < 40;
CategoryIDMaxPriceMinPriceMedianPriceAveragePrice
455.002.5028.7528.73
538.007.0022.5020.25
862.506.0034.2520.68

2. DISTINCT - 중복된 값들을 제거합니다.

  • GROUP BY 와 달리 집계함수가 사용되지 않습니다.
  • GROUP BY 와 달리 정렬하지 않으므로 더 빠릅니다.
  • ORDER BY로 수동으로 정렬가능!
SELECT DISTINCT CategoryID
FROM Products;
-- 위의 GROUP BY를 사용한 쿼리와 결과 비교
CategoryID
1
2
7
SELECT COUNT DISTINCT CategoryID
FROM Products;
-- 오류 발생
SELECT DISTINCT Country
FROM Customers
ORDER BY Country;

→ ORDER BY로 수동으로 정렬가능!

Country


Argentina


Austria


Belgium


Brazil


Canada



💡 GROUP BY와 DISTINCT 함께 활용하기

SELECT
  Country,
  COUNT(DISTINCT CITY)
FROM Customers
GROUP BY Country;
CountryCOUNT(DISTINCT CITY)
Argentina1
Austria2
Belgium2

0개의 댓글

관련 채용 정보