[SQL 달리기반 레벨 4] 🛒 단골 고객님 찾기

2025. 1. 31. 21:55·백엔드 부트캠프[사전캠프]/문제풀이

문제 🛒 단골 고객님 찾기

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

a. 출력 결과에는 고객 이름, 주문 건수, 총 주문 금액이 포함되어야 합니다. 

단, 주문을 한 적이 없는 고객도 결과에 포함되어야 합니다.

b. 기대결과

CustomerName
OrderCount
TotalSpent
Alice
2
450
Bob
2
280
Charlie
1
50
David
1
400

 

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

a. 기대결과

Country
Top_Customer
Top_Spent
USA
Alice
450
UK
Bob
280
Canada
David
400

1. 알고리즘

1) 고객별로 주문 건수와 총 주문 금액을 조회

- 고객별로 GROUP BY를 해야함. 

- 고객이름, 주문 건수, 총 주문금액 포함. 

- 주문 한적 없는 고객도 결과 포함. > LEFT 조인 해야함.

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

- 1단계: 먼저, Total Spent 를 구해준다.

- 2단계: Total Spent를 Rank 하여 준다.

- 3단계: Total Spent가 1등인 것만 구해준 후, 요구사항 값과 똑같이 CustomerName 순으로 정렬한다. 

 

2. SQL 코드

1) 

SELECT c.CustomerName, count(*) OrderCount,SUM(TotalAmount) TotalSpent
FROM Customers c LEFT JOIN Orders o on c.CustomerID = o.CustomerID
GROUP BY 1;

2) 

- 2번은 서브쿼리를 사용했다.

- 팀원들이 말했던 대로 ONLY_FULL_GROUP_BY 때문에 조금 까다로웠다.

- 1단계: 먼저, Total Spent 를 구해준다.

SELECT c.CustomerName, SUM(TotalAmount) TotalSpent
FROM Customers c LEFT JOIN Orders o on c.CustomerID = o.CustomerID
GROUP BY 1

- 2단계: Total Spent를 Rank 하여 준다.

SELECT ct.Country, ct.CustomerName, TotalSpent, rank() over(partition by ct.country order by TotalSpent desc) as rnk
from
(
SELECT c.CustomerName, SUM(TotalAmount) TotalSpent
FROM Customers c LEFT JOIN Orders o on c.CustomerID = o.CustomerID
GROUP BY 1
) a inner join Customers ct on a.CustomerName = ct.CustomerName

- 3단계: Total Spent가 1등인 것만 구해준 후, 요구사항 값과 똑같이 CustomerName 순으로 정렬한다.

SELECT Country, CustomerName, TotalSpent
FROM (
SELECT ct.Country, ct.CustomerName, TotalSpent, rank() over(partition by ct.country order by TotalSpent desc) as rnk
FROM
(
SELECT c.CustomerName, SUM(TotalAmount) TotalSpent
FROM Customers c LEFT JOIN Orders o on c.CustomerID = o.CustomerID
GROUP BY 1
) a inner join Customers ct on a.CustomerName = ct.CustomerName
)b
WHERE rnk = 1
ORDER BY CustomerName

'백엔드 부트캠프[사전캠프] > 문제풀이' 카테고리의 다른 글

[SQL 달리기반 레벨 5] 🏆 가장 많이 팔린 품목은?  (1) 2025.02.01
[SQL 달리기반 레벨 4] 💸 가장 높은 월급을 받는 직원은?  (0) 2025.02.01
[SQL 달리기반 레벨 3] 💳 이용자의 포인트 조회하기  (0) 2025.01.31
[SQL 달리기반 레벨 2] 📆 날짜별 획득포인트 조회하기  (2) 2025.01.31
[내일배움캠프-사전캠프 문제풀이] JAVA 보너스 문제 "가위바위 보"  (4) 2025.01.24
'백엔드 부트캠프[사전캠프]/문제풀이' 카테고리의 다른 글
  • [SQL 달리기반 레벨 5] 🏆 가장 많이 팔린 품목은?
  • [SQL 달리기반 레벨 4] 💸 가장 높은 월급을 받는 직원은?
  • [SQL 달리기반 레벨 3] 💳 이용자의 포인트 조회하기
  • [SQL 달리기반 레벨 2] 📆 날짜별 획득포인트 조회하기
sintory-04
sintory-04
🚀🚀🚀
  • sintory-04
    Sintory Dev Blog
    sintory-04
    글쓰기 관리
  • 전체
    오늘
    어제
    • 분류 전체보기 (289)
      • 백엔드 부트캠프 (111)
        • TIL (97)
        • WIL (0)
        • 문제풀이 (7)
        • 기타 (6)
      • 백엔드 부트캠프[사전캠프] (35)
        • TIL (16)
        • 문제풀이 (17)
        • 기타 (1)
      • Troubleshooting (11)
      • 코딩 공부 (118)
        • Java (28)
        • Baekjoon-Java (24)
        • Programmers-Java (40)
        • Spirngboot (11)
        • typescript (1)
        • JavaScript (6)
        • Spring 입문 (8)
      • 프로젝트 (8)
        • ToDoApp(FireBase) (3)
        • ToDoApp(Spring) (5)
      • 기타 (4)
  • 블로그 메뉴

    • 소개
    • Github
  • 최근 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
sintory-04
[SQL 달리기반 레벨 4] 🛒 단골 고객님 찾기
상단으로

티스토리툴바