SQL/문제

SQL | 달리기반 Lv4. 단골 고객님 찾기

jjangdoll 2024. 12. 23. 20:24

1. 고객별로 주문 건수와 총 주문 금액을 조회하는 SQL 쿼리를 작성해주세요. 
    - 출력 결과에는 고객 이름, 주문 건수, 총 주문 금액이 포함되어야 합니다. 단, 주문을 한 적이 없는 고객도 결과에 포함되어야 합니다.

내 답 : 

# 1. 고객별로 그룹화 group by customerid
# 2. 주문건수 count(*)
# 3. 총 주문금액 sum(TotalAmount)
# 4  두 테이블 조
# 5. 주문한 적 없는 고객도 결과에 포함되어야 
 
SELECT c.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 c.CustomerName ;

정답 : 

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.CustomerName;

2. 나라별로 총 주문 금액이 가장 높은 고객의 이름과 그 고객의 총 주문 금액을 조회하는 SQL 쿼리를 작성해주세요.

- Country, CustomerName, TotalAmount
- 나라별 - Group by Country
- 총 주문 금액이 가장 높은 고객 이름 - Max(TotalAmount)
- 고객의 총 주문 금액 - SUM(TotalAmount), Group by CustomerName

내 답 : 

# 나라별 그룹 group by country
# 총 주문 금액이 가장 높은 고객 이름 sum(totalamount) order by sum(totalamount) desc limit1 group by customername
# 그 고객의 총 주문 금액 sum(totalamount)

SELECT c.Country,
       c.CustomerName Top_Customer,
       SUM(o.TotalAmount) Top_Spent
FROM Customers c LEFT JOIN Orders o ON c.CustomerID = o.CustomerID
GROUP BY c.Country, c.CustomerName 
HAVING SUM(o.TotalAmount)=
    (
	SELECT MAX(Sum_Spent)
	FROM
		(
		SELECT SUM(o2.TotalAmount) Sum_Spent
		FROM Customers c2 LEFT JOIN Orders o2 ON c2.CustomerID = o2.CustomerID
		GROUP BY c2.CustomerID
		) sub
	) ;

정답 : 

SELECT 
    c.Country,
    c.CustomerName AS Top_Customer,
    SUM(o.TotalAmount) AS Top_Spent
FROM 
    Customers c
JOIN 
    Orders o ON c.CustomerID = o.CustomerID
GROUP BY 
    c.Country, c.CustomerName
HAVING 
    SUM(o.TotalAmount) = 
        (
        SELECT 
            MAX(SumSpent)
        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
    );

→ 제일 안 서브 쿼리 : 고객아이디로 그룹, 두 테이블 JOIN, 주문 금액 합
→ 그 다음 쿼리 : 주문 금액 합의 최댓값
→ 쿼리 : 두 테이블 JOIN,나라별로 그룹, 주문금액 합과 최댓값이 같다는 조건의 HAVING 


GROUP BY # DISTINCT와 같이 중복 제거 해줌
HAVING # 그룹화된 데이터에 조건을 검
WHERE # 테이블 전체 행 하나하나에 조건을 검