단골 고객님 찾기

수이·2025년 2월 17일
0

🟢 데일리퀘스트

목록 보기
19/19
post-thumbnail

Orders 테이블:

OrderIDCustomerIDOrderDateTotalAmount
10112024-01-01150
10222024-01-03200
10312024-01-04300
10432024-01-0450
10522024-01-0580
10642024-01-06400

Customers 테이블:

CustomerIDCustomerNameCountry
1AliceUSA
2BobUK
3CharlieUSA
4DavidCanada

요구사항:

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

    • 출력 결과에는 고객 이름, 주문 건수, 총 주문 금액이 포함되어야 합니다. 단, 주문을 한 적이 없는 고객도 결과에 포함되어야 합니다.
    • 기대결과
  2. 나라별로 총 주문 금액이 가장 높은 고객의 이름과 그 고객의 총 주문 금액을 조회하는 SQL 쿼리를 작성해주세요.

    • 기대결과
  1. 제약사항
  • 두 쿼리 모두 서브쿼리, 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한테 물어봄
정답을 봐도 이해가 잘 안 가서 쪼개서 봐야함

HAVING

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 쓰는 건 .. 어렵군요.. 이건 좀 더 공부해봐야 할 것 같다 🥲

0개의 댓글

관련 채용 정보