본문 바로가기

MySql

[내일 배움 캠프, 달리기 반] Lv5. 가장 많이 팔린 품목은?

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] 헷갈렸던 부분

행 : 3개
행 : 6개

문제 : 위 문제에서 각 테이블은 행의 갯수가 다르다. 그래서 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