seaking110 님의 블로그
사전 캠프 4일차 본문
오늘은 어제 못푼 sql 달리기반 문제 5번 2개를 먼저 풀려고 한다!
Lv.5 가장 많이 팔린 품목은?

각 고객이 구입한 총 금액과 주문 수를 구하는 문제로 당연히 고객id로 group by를 해야하고 customer 테이블의 고객 이름 orders 테이블에서 주문수와 총 구매 금액을 위한 order 테이블의 수량과 products 테이블의 price 컬럼이 필요했다.
3곳 모두에서 필요한게 있었기 때문에 단순하게 3개의 테이블을 조인 시켜서 풀었다.
내가 제출한 답
select c.CustomerName , sum(p.Price * o.Quantity) as TotalAmount, count(o.CustomerID) as OrderCount
from orders o
join products p on p.ProductID = o.ProductID
join customers c on o.CustomerID = c.CustomerID
group by o.CustomerID order by o.CustomerID ;
맨처음엔 서브쿼리를 써서 되게 복잡하게 생각했지만 단순하게 생각하니 쉽게 풀렸던 문제였다!

어제 풀었던 Lv 4 문제가 상당히 도움이 됐다! 정말 정말 어려웠지만 그래도 검색하지 않고 직접 풀었다! 이제는 서브쿼리를 그래도 조금 쓸 줄 안다고 생각한다!
내가 제출한 답
select Category , ProductName as Top_Product, Quantity as TotalSold from
(select p.ProductName, p.Category, sum(o.quantity) as Quantity,
rank() over (partition by p.Category order by sum(o.Quantity) desc) as rn
from orders o join products p on p.ProductID = o.ProductID group by o.productID
) as a
where rn = 1;
Lv.5 예산이 가장 큰 프로젝트는?

이제 가장 높은 한 줄만 출력하는건 정말 쉽다고 느껴졌다 확실히 도움이 되는 느낌이라 뿌듯하다.
rank() over (patition by 칼럼명) 이건 정말 꼭 외워두자! 아주 아주 유용하다!
내가 제출한 답
select name, department, salary from
(select name, department, salary, rank() over(partition by department order by salary desc) as rn
from employees) as a
where rn = 1;

projecs 테이블과 emplyees 테이블을 조인해야하는데 중복되는 칼럼이 없다! 조인을 위해 양쪽 테이블의 모두 중복된 칼럼을 가지고 있는 EmplyeeProjects 테이블을 중간 다리 역할로 이용하자! 그외에 나머지 어려운 부분은 없다!
내가 제출한 답
select e.Name, p.ProjectName, p.Budget
from employees e
join employeeprojects ej on e.EmployeeID = ej.EmployeeID
join projects p on p.ProjectID = ej.ProjectID
where p.Budget >= 10000 order by p.ProjectName;
이로써 달리기반 문제를 모두 풀었는데 이젠 서브 쿼리, rank에 대한 부분도 확실히 감을 잡은 느낌이고 Lv5의 예산이 가장 큰 프로젝트 보다 Lv.4 문제들이 더 난이도 있었던거 같다! 쿼리문을 풀다 보니 확실히 재밌고 데이터를 만지고 추출해 내는 부분이 상당히 재밌게 느껴져서 좋았다!