1. SQL 개인과제
"조건에 맞는 쿼리문을 작성하고 해설을 작성하기"
쿼리문을 올렸놨으니 자유로운 훈수 부탁드립니다
**문제 1:** "최소 주문 날짜 찾기"
주어진 테이블 **`list_of_orders`**에는 여러 주문들의 날짜가 저장되어 있습니다.
주문 날짜는 'dd-mm-yyyy' 형식으로 저장되어 있습니다.
이 테이블에서 가장 이른 주문 날짜를 찾아보세요.
select a.ORDER_DATE
from (
select STR_TO_DATE(order_date, "%Y-%m-%d") as ORDER_DATE
from list_of_orders
) a
where ORDER_DATE is not null
order by 1
limit 1
좀 살펴보니 order_date에 null값이 있어서 where로 처리
**문제 2:** "카테고리별 총 매출 계산하기"
**`order_details`** 테이블에는 다양한 주문들의 세부 정보가 저장되어 있습니다.
각 주문은 특정 'Category'에 속하며,
각 주문의 'Amount'는 그 주문의 매출 금액을 나타냅니다.
이 테이블을 사용하여 각 카테고리별 총 매출 금액을 계산하세요.
select Category,
SUM(AMOUNT) as TOTAL_AMOUNT
from order_details
group by Category
**문제 3:** "상위 5명의 고객별 총 구매액 찾기"
두 개의 테이블 **`order_details`**와 **`list_of_orders`**가 있습니다.
**`order_details`** 테이블은 각 주문의 세부사항을 포함하고 있으며,
**`list_of_orders`** 테이블은 주문에 대한 고객의 이름과 주문 ID를 포함합니다.
각 고객별로 총 구매액을 계산하여,
구매액이 가장 높은 상위 5명의 고객을 찾아보세요.
select loo.customername,
SUM(OD.Amount) as TOTAL_AMOUNT
from list_of_orders loo
inner join order_details od
on LOO.order_id = OD.order_id
group by LOO.customername
order by 2 desc
limit 5
unique한 값에 대한 얘기를 팀원들과 한 결과
-> 나는 customername을 기준으로 하기로 결정
**문제 4:** "여러 주문을 한 고객들의 총 구매액 계산하기"
두 테이블 **`list_of_orders`**와 **`order_details`**가 있습니다.
**`list_of_orders`** 테이블은 고객 이름과 주문 ID를,
**`order_details`** 테이블은 각 주문의 상세 금액을 포함하고 있습니다.
이 테이블들을 사용하여, 3개 이상의 주문을 한 고객들의 이름,
총 주문 횟수, 그리고 그들의 총 구매액을 계산하세요.
select distinct a.customername,
a.total_count,
a.total_amount
from list_of_orders loo
inner join (select LOO.customername,
COUNT(*) as TOTAL_COUNT,
SUM(OD.AMOUNT) as TOTAL_AMOUNT
from list_of_orders loo
inner join order_details od
on LOO.order_id = OD.order_id
group by LOO.customername) a
on loo.customername = a.customername
where TOTAL_COUNT >= 3
order by TOTAL_COUNT desc, TOTAL_AMOUNT desc
- 서브쿼리 내에서 고객 별로 count
- join 후 count를 where에서 조건으로 사용
- distinct로 동일 고객의 다른 주문들은 쳐낸다
**문제 5:** "평균 수량을 초과하는 주문 찾기"
**`order_details`** 테이블에는 다양한 주문들의 상세 정보가 저장되어 있습니다.
이 테이블의 각 행은 주문 ID(**`order_id`**), 카테고리(**`Category`**),
그리고 주문 수량(**`Quantity`**)을 포함합니다.
이 테이블을 사용하여 각 카테고리별 평균 주문 수량을 초과하는
모든 주문들을 찾아보세요.
select od.order_id,
od.category,
od.quantity,
a.avg_quantity
from order_details od
inner join (select Category,
AVG(Quantity) as avg_quantity
from order_details
group by Category) a
on od.category = a.category
where od.quantity > a.avg_quantity
order by od.quantity desc
앞과 마찬가지로 where에 조건으로 사용하기 위해
서브쿼리에 avg를 사용
> **문제 6:** "카테고리별 매출액 순위 및 누적합계 계산하기"
**`order_details`** 테이블에는 주문의 상세 정보가 포함되어 있습니다.
이 테이블은 주문 ID(**`order_id`**), 카테고리(**`Category`**),
그리고 주문의 금액(**`Amount`**)을 포함합니다.
이 테이블을 사용하여 각 카테고리 내에서 각 주문의 매출액 순위와
그 카테고리 내의 누적 매출액을 계산하세요.
select order_id,
category,
amount,
rank() over(partition by category order by amount desc) as amount_rank,
sum(amount) over (partition by category order by order_id) as cum_sum_amount
from order_details
order by category, cum_sum_amount, amount
- rank
카테고리 내에서의 - partition by category
매출액 순위 - order by amount
- sum
카테고리 내에서의 - partition by category
누적매출액 - sum(amount)
**문제 7:** "주별 매출 순위 및 평균 매출 목표 달성 여부 확인"
**`list_of_orders`**, **`order_details`**, 그리고 **`sales_target`** 세 개의 테이블이 있습니다.
**`list_of_orders`** 테이블은 주문 ID(**`order_id`**)와 주문이 이루어진 주(**`State`**를,
**`order_details`** 테이블은 각 주문의 금액(**`Amount`**)과 이익(**`Profit`**)을,
**`sales_target`** 테이블은 각 카테고리별 매출 목표(**`Target`**)를 포함합니다.
이 테이블들을 사용하여 각 주별로 주문의 총 금액과 이익을 계산하고,
각 주 내에서 주문의 매출 순위를 결정하세요.
또한, 각 주문의 총 금액이 해당 카테고리의 평균 매출 목표의 50%를 달성했는지 여부도 판단하세요.
select loo.order_id,
loo.state,
a.total_amount,
od2.amount,
rank() over(partition by loo.state order by od2.amount desc) amount_rank_in_state,
od2.category,
st.avg_target,
if(od2.amount >= st.avg_target/2, 'success', 'fail') as goal
from list_of_orders loo
inner join (select loo.state,
sum(od.amount) as total_amount,
sum(od.profit) as total_profit
from list_of_orders loo
inner join order_details od
on loo.order_id = od.order_id
group by loo.State) a
on loo.state = a.state
inner join order_details od2
on loo.order_id = od2.order_id
inner join (select category,
avg(target) as avg_target
from sales_target
group by category) st
on od2.category = st.category
order by 2, 3 desc
- (총금액, 총이익), 매출순위, 평균매출목표
구해야할 게 많아서 그만큼 서브쿼리도 늘어남 코드가 어지럽다면 그건 저 역시도 마찬가지 상관없다고 생각합니다
2. 개인과제를 하며...
- 코드카타는 학습용으로 매우 친절한 문제였다
- 다른 사람이 보면 내 코드는 random walk
- 그만큼 나는 아직 많이 부족하다
- 아직은 코드 최적화보다는 그래도 원하는 것을 얻는 코드를 추구하자..
'TIL' 카테고리의 다른 글
내배캠 TIL 11일차 (0) | 2024.01.03 |
---|---|
내배캠 TIL 10일차 (1) | 2024.01.02 |
내배캠 TIL 8일차 (1) | 2023.12.30 |
내배캠 TIL 7일차 (1) | 2023.12.30 |
내배캠 TIL 6일차 (0) | 2023.12.30 |