본문 바로가기
공부/알고리즘

[Solvesql - Advent of SQL 2024] 온라인 쇼핑몰의 월 별 매출액 집계 풀이

by 맑은청이 2024. 12. 31.
728x90
반응형

저는 과거 데이터리안의 sql 강의를 수강한 적이 있습니다. 

그래서 solvesql 문제가 개방되어 있어요! 

강의를 듣지 않아도 무료 문제가 많으니 방문하셔서 sql 문제 푸는 걸 강추합니다. 

https://solvesql.com/collections/advent-of-sql-2024/

 

https://solvesql.com/collections/advent-of-sql-2024/

 

solvesql.com

 


1 . 문제

문제는 유출하면 안 돼서 간단히 말하면 총매출, 즉 월별 취소총액, 주문총액을 구하기. 

 

2. 접근 

1)  월별 GROUP BY을 위한 Su

date가 'YYYY-MM-DD' 형이었기 때문에 'YYYY-MM'으로 처리해야 했다. 

SUBSTR을 사용했다. 

 

SUBSTR(str, start, length)
  • start: 시작 위치 (1부터 시작)
  • length: 추출할 문자 수

SUBSTR(orders.order_date,1,7) 하면 'YYYY-MM'로 처리할 수 있다. 

이 방법 뿐만 아니라 다른 함수를 사용해도 무방하다. 

 

2) CASE문을 통한 취소주문 총액 구하기 

CASE문은 조건문이나 계산처리에 활용할 수 있다. 

CASE 
    WHEN 조건1 THEN 결과1
    WHEN 조건2 THEN 결과2
    ELSE 결과3
END

 

 - 계산처리

SELECT 
    id,
    price,
    quantity,
    CASE 
        WHEN quantity >= 10 THEN price * 0.9 -- 10% 할인
        ELSE price
    END AS final_price
FROM orders;

 

- 조건문 

SELECT 
    name,
    age,
    CASE 
        WHEN age < 18 THEN 'Minor'
        WHEN age >= 18 AND age < 65 THEN 'Adult'
        ELSE 'Senior'
    END AS age_group
FROM users;

 

3) 정답코드 

SELECT SUBSTR(orders.order_date,1,7) as order_month, 
  sum(
    case
       when SUBSTR(orders.order_id,1,1) = 'C' THEN 0
       else price * quantity
    END
  ) AS ordered_amount
  ,sum(
    case
       when SUBSTR(orders.order_id,1,1) = 'C' THEN price * quantity
       else 0
    END
  ) AS canceled_amount,
  sum(case
       when SUBSTR(orders.order_id,1,1) = 'C' THEN (price * quantity)
       else price * quantity
    END) AS total_amount
FROM order_items
LEFT JOIN orders
ON order_items.order_id = orders.order_id
GROUP BY SUBSTR(orders.order_date,1,7) 
ORDER BY order_month;

 

 

 

처음에 맞게 했는데 왜 계속 틀리지 싶었는데 quantity를 곱하지 않아서 값이 맞지 않았다 ㅎ.

문제가 재밌었다! 

728x90
반응형