1. 문제

[5-1] 풀이
SELECT CustomerName,
SUM(Price*Quantity) TotalAmount,
count(1) OrderCount
FROM
(
SELECT c.CustomerName,
o.Quantity,
o.ProductID
FROM customers c LEFT JOIN orders o ON c.CustomerID=o.CustomerID
) a LEFT JOIN products p ON a.productID=p.ProductID
GROUP BY 1
- 세 개의 테이블에서 데이터를 가져와야 하므로, 2번의 JOIN 연산을 하였다.
[5-1] 헷갈렸던 부분
문제 : 위 문제에서 각 테이블은 행의 갯수가 다르다. 그래서 LEFT JOIN 연산 시, 왼쪽에 오는 테이블에 따라 조회되는 임시 테이블의 행의 갯수가 달라질거라 생각했다.
- ex) ...FROM customers c LEFT JOIN orders o on c.CustomerID=o.CustomerID
- 예상 결과 → 조회되는 테이블 총 행의 갯수 : 3개
정리 : JOIN 연산 결과는 공통 컬럼의 데이터에 따라 달라진다.
- 두 테이블의 공통 컬럼은 CustomerID이다. 예상 했던 행의 갯수는 3개였지만, 6개가 출력이 되었다. 이는 공통 컬럼과 연관된 데이터가 양쪽 테이블 모두 존재하기 때문이다.
[5-2] 풀이
select Category,
ProductName,
TotalSold
from
(
select Category,
ProductName,
sum(Quantity) TotalSold,
Rank() over(partition by Category ORDER BY SUM(Quantity) DESC) rk
from products p left join orders o on p.ProductID=o.ProductID
group by 1, 2
) a
where rk=1
'MySql' 카테고리의 다른 글
[내일 배움 캠프, SQL 달리기 반] Lv5. 예산이 가장 큰 프로젝트는? (0) | 2025.03.27 |
---|---|
[내일 배움 캠프, SQL 달리기 반] Lv4. 가장 높은 월급을 받는 직원은? (0) | 2025.03.25 |
[내일 배움 캠프, SQL 달리기 반] Lv4. 단골 고객님 찾기 (0) | 2025.03.25 |
[내일 배움 캠프, SQL 달리기 반] Lv3. 이용자의 포인트 조회하기 (0) | 2025.03.24 |
[내일 배움 캠프 4-5] JOIN이란? (0) | 2025.03.24 |