MySql
[내일 배움 캠프, SQL 달리기 반] Lv4. 단골 고객님 찾기
kimyongjun0129
2025. 3. 25. 15:46
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 문에서 바로 사용할 수 없다.