본문 바로가기

SQL

SQL 실전! 실제 DB에서 연습해요(2) - Lv4. 단골 고객님 찾기

 

1. 고객별로 주문 건수와 총 주문 금액을 조회하는 SQL 쿼리를 작성해주세요.

select c.CustomerName CustomerName,
		count(o.OrderID) OrderCount,
		coalesce (sum(o.TotalAmount), 0) TotalSpent
from Customers c
left join Orders o
	on c.CustomerID = o.CustomerID
group by 1
  • 주문건수가 없는 고객의 주문 횟수를 어떤 식으로 생각할지 고민했음
  • -> 결국 주문건수가 없다는 것은 orderId가 없다는 것임
  • coalesce (sum(o.TotalAmount), 0)    널인 항목을 0으로 대신 넣겠다

 

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

select Country,
	CustomerName Top_Customer,
	total_amount Top_Spent
from 
(
select c.Country 
	, c.CustomerName
	, sum(o.TotalAmount) total_amount
	, rank() over (partition by c.Country order by sum(o.TotalAmount) desc) ranking
from Customers_n c
left join Orders_n o
	on c.CustomerID = o.CustomerID
group by 1, 2
) a
where ranking = 1

 

  • 윈도우 함수의 사용법 
    • <윈도우 함수> OVER ([PARTITION BY <>] [ORDER BY <>])
      • 윈도우 함수: 수행할 작업(예: SUM, AVG, RANK, ROW_NUMBER 등).
      • OVER: 윈도우 함수의 범위를 정의.
      • PARTITION BY (선택 사항): 데이터를 특정 그룹으로 나누는 역할. 생략하면 전체 데이터에 대해 계산.
      • ORDER BY (선택 사항): 윈도우 내에서 특정 기준으로 정렬 후 계산.
SELECT c.Country,
		c.CustomerName,
		sum(o.TotalAmount) TotalAmount
from Customers_n c
inner join Orders_n o 
	on c.CustomerID = o.CustomerID
group by 1, 2
	having TotalAmount = (
		select max(a.total) 
		from
		(
		SELECT c_n.Country,
			c_n.CustomerName,
			sum(o_n.TotalAmount) total
		from Customers_n c_n
		inner join Orders_n o_n
		on c_n.CustomerID = o_n.CustomerID
		group by 1, 2
		) a
		where a.Country = c.Country
	)

 

  • group by 절에서 조건을 걸때는 having을 사용
  • 그룹화할때의 조건을 주로 having에서 사용함
  • where a.Country = c.Country 
    • 이 부분에서 나라별로 최대 주문 금액을 가져올 수 있다는 점을 배웠다 (쉽지 않았다 ㅠ)