[달리기반] LV.4-1 단골 고객님 찾기

심재민·2025년 2월 10일

SQL 달리기반 문제

목록 보기
1/3
create table Orders (
	OrderID int,
	CustomerID int,
	OrderDate date,
	TotalAmount int
);

create table Customers (
	CustomerID int,
	CustomerName varchar(255),
	Country varchar(255)
);


insert into Orders (OrderID, CustomerID, OrderDate, TotalAmount)
values (101, 1, '2024-01-01', 150);

insert into Orders (OrderID, CustomerID, OrderDate, TotalAmount)
values (102, 2, '2024-01-03', 200);

insert into Orders (OrderID, CustomerID, OrderDate, TotalAmount)
values (103, 1, '2024-01-04', 300);

insert into Orders (OrderID, CustomerID, OrderDate, TotalAmount)
values (104, 3, '2024-01-04', 50);

insert into Orders (OrderID, CustomerID, OrderDate, TotalAmount)
values (105, 2, '2024-01-05', 80);

insert into Orders (OrderID, CustomerID, OrderDate, TotalAmount)
values (106, 4, '2024-01-06', 400);

insert into Customers (CustomerID, CustomerName, Country)
values (1, 'Alice', 'USA');

insert into Customers (CustomerID, CustomerName, Country)
values (2, 'Bob', 'UK');

insert into Customers (CustomerID, CustomerName, Country)
values (3, 'Charlie', 'USA');

insert into Customers (CustomerID, CustomerName, Country)
values (4, 'David', 'Canada');


select c.CustomerName, count(o.CustomerID) as OrderCount, coalesce(sum(o.TotalAmount)) as TotalSpent
from Orders o
left join Customers c on o.CustomerID = c.CustomerID
group by c.CustomerName;

select c.Country, c.CustomerName as Top_Customer, sum(o.TotalAmount) as Top_Spent
-- 	나라, 이름을 묶고 합산을 구한다, 그러면 고객별 합산 금액이 나온다.
-- 	나라가 들어가는 이유는 이후 나라별과 고객별 금액의 연결점이기 때문
from Customers c
join Orders o on o.CustomerID = c.CustomerID
group by c.Country, c.CustomerID, c.CustomerName
-- 	나라와 고객의 이름을 묶는다.
-- 	여기까지가 각 고객별 총 주문 금액
having sum(TotalAmount) = (
-- 	조건/ 고객별 총 주문 금액 = ( 국가별 최고 지출 금액
	select max(Total_spent)
-- 	합산 중 최고 지출 금액
	from (
		select c2.Country, c2.CustomerID, sum(o2.TotalAmount) as Total_Spent
-- 		나라, ID를 묶고 합산을 구한다, 그러면 나라별 합산 금액이 나온다,
-- 		그것을 Total_Spent로 부르고 그중 최고값을 찾는다. (이름은 중복이 있을 수 있기 때문에 이름 대신 ID로 대체)
		from Customers c2
		join Orders o2 on o2.CustomerID = c2.CustomerID
		group by c2.Country, c2.CustomerID
-- 		나라, ID를 묶는다
	) as Country_Spent
	where  Country_Spent.Country = c.Country
-- 	고객별 총 주문금액과 국가별 최고 지출금액의 연결점, 나라로 하는 이유는 각 나라별 최고 금액을 찾는 것이기 때문
);

4-1번 문제를 풀며 느낀 점

  1. 서브쿼리를 사용하기 시작하니 난잡? 복잡해져서 어느 구절이 무엇인지 알아보기 힘들었음
    주석을 다는 것으로 해당 코드가 무슨 역활인지 표기하는 것으로 해소
profile
코딩으로 다시 시작하고 싶습니다!

0개의 댓글