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번 문제를 풀며 느낀 점