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 (선택 사항): 윈도우 내에서 특정 기준으로 정렬 후 계산.
- <윈도우 함수> 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
- 이 부분에서 나라별로 최대 주문 금액을 가져올 수 있다는 점을 배웠다 (쉽지 않았다 ㅠ)
'SQL' 카테고리의 다른 글
SQL 실전! 실제 DB에서 연습해요(3) - Lv4. 가장 높은 월급을 받는 직원은? (1) | 2024.12.10 |
---|---|
HAVING 절과 WHERE 절의 차이 (0) | 2024.12.10 |
SQL 실전! 실제 DB에서 연습해요(1) (0) | 2024.12.10 |
SQL 문법 연습 - 11) 마지막 연습 문제 ! (1) | 2024.12.09 |
SQL 문법 연습 - 10) 이젠 테이블이 2개입니다 (0) | 2024.12.07 |