본문 바로가기

MySql

[내일 배움 캠프, SQL 달리기 반] Lv4. 단골 고객님 찾기

1. 문제

 

 

 

 

2. 풀이

[4-1]

SELECT 
	CustomerName,
	count(OrderID) OrderCount,
	IF(sum(TotalAmount) is null, 0, sum(TotalAmount)) TotalSpent
FROM
(
	SELECT
		c.CustomerName,
		o.TotalAmount,
		o.OrderID
	FROM customers c LEFT JOIN orders o ON c.CustomerID=o.CustomerID
) a
GROUP BY 1
  • 나중에 주문한 적이 없는 고객을 예외처리하기 위해 서브쿼리에서 OrderID를 함께 넘겨주었다. 
  • 메인쿼리에서 OrderID를 카운트한다. 만약 OrderID가 null이면, 카운트하지 않는다.

 

 

 

[4-2]

select Country,
       CustomerName,
       Top_Spent
from
(
    select c.Country,
           c.CustomerName,
           sum(o.TotalAmount) Top_Spent,
           RANK() OVER(partition by c.Country order by SUM(TotalAmount) desc) Top_Customer
    from orders o left join customers c on o.CustomerID=c.CustomerID
    group by 1, 2
) a
where Top_Customer=1
order by 1 desc
  • 가장 높은 고객이라는 조건을 반영하여, WHERE 문으로 랭킹이 1등이 아닌 것은 필터링해주었다. 이때 WHERE 문을서브쿼리가 아닌 메인쿼리에 넣은 것은 SQL문의 실행 순서 때문이다.
  • 참고로, 같은 SELECT 문에서 붙인 alias(별칭)는 같은 SELECT 문에서 바로 사용할 수 없다.