Orders 테이블:
OrderID | CustomerID | OrderDate | TotalAmount |
---|---|---|---|
101 | 1 | 2024-01-01 | 150 |
102 | 2 | 2024-01-03 | 200 |
103 | 1 | 2024-01-04 | 300 |
104 | 3 | 2024-01-04 | 50 |
105 | 2 | 2024-01-05 | 80 |
106 | 4 | 2024-01-06 | 400 |
Customers 테이블:
CustomerID | CustomerName | Country |
---|---|---|
1 | Alice | USA |
2 | Bob | UK |
3 | Charlie | USA |
4 | David | Canada |
고객별로 주문 건수와 총 주문 금액을 조회하는 SQL 쿼리를 작성해주세요.
나라별로 총 주문 금액이 가장 높은 고객의 이름과 그 고객의 총 주문 금액을 조회하는 SQL 쿼리를 작성해주세요.
JOIN
, GROUP BY
, HAVING
등을 사용해 풀 수 있어야 한다.문제 1>
SELECT c.CustomerName,
COUNT(o.OrderID) AS OrderCount,
COALESCE(SUM(o.TotalAmount), 0) AS TotalSpent
FROM Customers c LEFT JOIN Orders o ON c.CustomerID = o.CustomerID
GROUP BY c.CustomerID, c.CustomerName
문제 2>
HAVING 함수를 배운 적이 없는 것 같아서 gpt한테 물어봄
정답을 봐도 이해가 잘 안 가서 쪼개서 봐야함
GROUP BY
로 그룹화된 결과에서 특정 조건을 필터링할 때 사용
WHERE
절은 개별 행을 필터링하는 반면, HAVING
은 집계 함수(SUM(), COUNT() 등)를 사용한 결과에 조건을 적용할 때 사용
SELECT
c.Country,
c.CustomerName AS Top_Customer,
SUM(o.TotalAmount) AS Top_Spent -- 1. 각 고객의 총 주문금액 계산
FROM
Customers c
JOIN
Orders o ON c.CustomerID = o.CustomerID
GROUP BY
c.Country, c.CustomerName -- 2. 각 나라별 고객별 주문 금액 그룹화
HAVING -- 3-2. 각 나라에서 최고 주문 금액을 가진 고객만 남기기
SUM(o.TotalAmount) = (
SELECT
MAX(SumSpent) -- 3-1. 각 나라에서 가장 높은 총 주문 금액 계산
FROM
(SELECT
SUM(o2.TotalAmount) AS SumSpent
FROM
Customers c2
JOIN
Orders o2 ON c2.CustomerID = o2.CustomerID
WHERE
c2.Country = c.Country
GROUP BY
c2.CustomerID) AS Subquery
)
HAVING
쓰는 건 .. 어렵군요.. 이건 좀 더 공부해봐야 할 것 같다 🥲