sql
having group by sum collase
148june
2025. 2. 4. 16:42
문제:
Products 테이블:
ProductID | ProductName | Category | Price |
1 | Laptop | Electronics | 1000 |
2 | Smartphone | Electronics | 800 |
3 | Headphones | Electronics | 150 |
4 | Coffee Maker | Home | 200 |
5 | Blender | Home | 100 |
Orders 테이블:
OrderID | ProductID | OrderDate | Quantity | CustomerID |
101 | 1 | 2024-02-01 | 2 | 1 |
102 | 3 | 2024-02-02 | 1 | 2 |
103 | 2 | 2024-02-03 | 1 | 1 |
104 | 4 | 2024-02-04 | 3 | 3 |
105 | 1 | 2024-02-05 | 1 | 2 |
106 | 5 | 2024-02-06 | 2 | 3 |
Customers 테이블:
CustomerID | CustomerName | Country |
1 | Alice | USA |
2 | Bob | UK |
3 | Charlie | USA |
요구사항:
- 각 고객이 구매한 모든 제품의 총 금액을 계산하고, 고객 이름, 총 구매 금액, 주문 수를 출력하는 SQL 쿼리를 작성해주세요.
CustomerName TotalAmount OrderCount Alice 2600 3 Bob 950 2 Charlie 800 2 - 각 제품 카테고리별로 가장 많이 팔린 제품의 이름과 총 판매량을 조회하는 SQL 쿼리를 작성해주세요.
Category Top_Product TotalSold Electronics Laptop 3 Home Coffee Maker 3
SELECT
c.CustomerName,
SUM(p.Price * o.Quantity) AS TotalAmount,
COUNT(o.OrderID) AS OrderCount
FROM Orders o
JOIN Products p ON o.ProductID = p.ProductID
JOIN Customers c ON o.CustomerID = c.CustomerID
GROUP BY c.CustomerName;
Orders 테이블을 Products 테이블과 Customers 테이블에 JOIN하여 고객별로 주문한 제품의 가격과 수량을 가져옵니다.
SUM(p.Price * o.Quantity)를 사용하여 고객별 총 구매 금액(TotalAmount)을 계산합니다.
COUNT(o.OrderID)를 사용하여 고객이 한 총 주문 수(OrderCount)를 계산합니다.
GROUP BY c.CustomerName을 사용하여 고객별로 그룹화하여 결과를 집계합니다.
WITH CategorySales AS (
SELECT
p.Category,
p.ProductName,
SUM(o.Quantity) AS TotalSold,
RANK() OVER (PARTITION BY p.Category ORDER BY SUM(o.Quantity) DESC) AS rnk
FROM Orders o
JOIN Products p ON o.ProductID = p.ProductID
GROUP BY p.Category, p.ProductName
)
SELECT Category, ProductName, TotalSold
FROM CategorySales
WHERE rnk = 1;
WITH CategorySales AS (...) (공통 테이블 표현식 CTE)
- Orders 테이블과 Products 테이블을 JOIN하여 각 제품의 총 판매량(SUM(o.Quantity) AS TotalSold)을 구합니다.
- GROUP BY p.Category, p.ProductName를 사용하여 제품별로 그룹화합니다.
- RANK() OVER (PARTITION BY p.Category ORDER BY SUM(o.Quantity) DESC) AS rnk를 사용하여 카테고리별 판매량 순위를 매깁니다. RANK()는 동일한 판매량을 가진 제품이 있을 경우 같은 순위를 부여합니다.
SELECT문에서 rnk = 1인 제품만 선택
- 가장 많이 팔린 제품만 결과로 출력됩니다.