SQL 연습 문제 - Lv4. 단골 고객님 찾기

이희수·2024년 12월 18일

Orders 테이블:

OrderIDCustomerIDOrderDateTotalAmount
10112024-01-01150
10222024-01-03200
10312024-01-04300
10432024-01-0450
10522024-01-0580
10642024-01-06400

Customers 테이블:

CustomerIDCustomerNameCountry
1AliceUSA
2BobUK
3CharlieUSA
4DavidCanada

요구사항:

  1. 고객별로 주문 건수와 총 주문 금액을 조회하는 SQL 쿼리를 작성해주세요.
    1. 출력 결과에는 고객 이름, 주문 건수, 총 주문 금액이 포함되어야 합니다. 단, 주문을 한 적이 없는 고객도 결과에 포함되어야 합니다.

    2. 기대결과

      CustomerNameOrderCountTotalSpent
      Alice2450
      Bob2280
      Charlie150
      David1400

      내가 작성한 쿼리 :

select CustomerName , 
       count(distinct OrderID) OrderCount, 
       SUM(TotalAmount) TotalSpent
from customers c 
     left join orders o 
     on c.CustomerID = o.CustomerID
group by 1
having count(OrderID) >=0

주문정보가 없는 고객의 데이터도 가져와야 하니, customers테이블을 기준으로 join해준다.
각 고객의 총 주문 건수와 총 주문 금액을 계산해야 하니, count()함수와 SUM()함수를 사용해준다. 각 고객별로 결과를 알고 싶으니, group by CustomerName 으로 그룹핑 해준다. (=group by 1)

중복되는 주문 없이 카운트 할 수 있도록 distinct키워드를 사용해준다.

where 절에 aggregate 함수 넣고 싶을 때, where 대신 having 을 쓰면 된다.

  1. 나라별로 총 주문 금액이 가장 높은 고객의 이름과 그 고객의 총 주문 금액을 조회하는 SQL 쿼리를 작성해주세요.
    1. 기대결과

      CountryTop_CustomerTop_Spent
      USAAlice450
      UKBob280
      CanadaDavid400

내가 작성한 쿼리 :

select Country, CustomerName, sum_amount
from
(
select Country, CustomerName, sum_amount,
       rank () over (partition by Country order by sum_amount desc) ranking
from 
(
select Country , 
       CustomerName , 
       sum(TotalAmount) sum_amount
from customers c left join orders o on c.CustomerID = o.CustomerID
group by 1,2
) a )b 
where ranking = 1

고객 별로 총 주문 금액을 계산해주는 첫번째 서브쿼리,
나라별 주문 금액이 많은 순으로 랭킹을 매겨주는 두번째 서브쿼리,
나라별 주문 금액이 가장 많은 (랭킹이 1인) 고객만 결과값으로 보여주는 마지막 select문 순서로 쿼리를 작성했다.

0개의 댓글