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 문에서 바로 사용할 수 없다.
'MySql' 카테고리의 다른 글
[내일 배움 캠프, 달리기 반] Lv5. 가장 많이 팔린 품목은? (0) | 2025.03.26 |
---|---|
[내일 배움 캠프, SQL 달리기 반] Lv4. 가장 높은 월급을 받는 직원은? (0) | 2025.03.25 |
[내일 배움 캠프, SQL 달리기 반] Lv3. 이용자의 포인트 조회하기 (0) | 2025.03.24 |
[내일 배움 캠프 4-5] JOIN이란? (0) | 2025.03.24 |
[내일 배움 카드, 달리기 반] Lv2. 날짜 별 획득 포인트 조회하기 (0) | 2025.03.24 |