«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Recent Posts
Today
Total
관리 메뉴

짜리몽땅 매거진

[SQL] solvesql 코딩테스트 연습2 본문

Data/SQL

[SQL] solvesql 코딩테스트 연습2

쿡국 2024. 3. 26. 20:29

문제1.  멘토링 짝꿍 리스트

출처 : solvesql 연습문제

문제 정보 : 난이도 3 / 정답률 40.68%

https://solvesql.com/problems/mentor-mentee-list/

 

정답 쿼리

SELECT a.employee_id AS mentee_id, a.name AS mentee_name, b.employee_id AS mentor_id, b.name AS mentor_name
FROM employees a
cross join employees b
WHERE a.join_date BETWEEN '2021-10-01' and '2021-12-31'
AND b.join_date <= '2019.12.31'
AND a.department != b.department
ORDER BY mentee_id, mentor_id

 

문제 해설

1. 주요 포인트 1 - cross join

FROM employees a
cross join employees b

 

같은 테이블에 속한 직원들을 각각 다른 기간을 기준으로 멘토, 멘티로 구분해야 한다. 따라서 cross join을 통해 멘토멘티로 조합이 가능한 모든 경우의 수를 우선적으로 출력한다.

 

2. 주요 포인트 2 - where 절

WHERE a.join_date BETWEEN '2021-10-01' and '2021-12-31'
AND b.join_date <= '2019.12.31'
AND a.department != b.department

 

설정한 alias에 맞게 멘티일 경우 날짜 기준, 멘토일 경우 날짜 기준 조건을 각각 걸어주고 멘토와 멘티는 각각 다른 부서여야 하기 때문에 총 3개의 조건절을 걸어준다.


문제2.  배송 예정일 예측 성공과 실패

출처 : solvesql 데이터리안 sql캠프 실전반

문제 정보 : 난이도 3 / 정답률 40.83%

https://solvesql.com/problems/estimated-delivery-date/

 

정답 쿼리

SELECT 
    strftime('%Y-%m-%d', o.order_purchase_timestamp) AS purchase_date,
    COUNT(CASE WHEN o.order_estimated_delivery_date >= o.order_delivered_customer_date THEN o.order_id END) AS success,
    COUNT(CASE WHEN o.order_estimated_delivery_date < o.order_delivered_customer_date THEN o.order_id END) AS fail
FROM olist_orders_dataset AS o
WHERE o.order_purchase_timestamp like '2017-01%'
      AND o.order_delivered_customer_date IS NOT NULL 
      AND o.order_estimated_delivery_date IS NOT NULL
GROUP BY purchase_date
ORDER BY purchase_date;

 

문제 해설

 

1. 주요 포인트 1 - select 절

SELECT 
    strftime('%Y-%m-%d', o.order_purchase_timestamp) AS purchase_date,
    COUNT(CASE WHEN o.order_estimated_delivery_date >= o.order_delivered_customer_date THEN o.order_id END) AS success,
    COUNT(CASE WHEN o.order_estimated_delivery_date < o.order_delivered_customer_date THEN o.order_id END) AS fail

 

mysql이 아닌 sqlite의 경우 date_format이 아닌 strftime으로 날짜 포맷을 변경한다.(함수가 다를 뿐 결과값은 동일)

또한 case when then 구문과 count 집계함수를 통해 배송예정일과 실제 배송날짜 간 두가지 케이스를 구분하여 작성해준다.

 

필자의 경우 스칼라 서브쿼리를 처음에 사용했는데 sqlite의 경우 스칼라 서브쿼리에서 외부 쿼리의 컬럼을 참조하는 것이 지원되지 않아 다른 구문으로 바꿔 작성하였다.

 

2. 주요 포인트 2 - where 절

WHERE o.order_purchase_timestamp like '2017-01%'
      AND o.order_delivered_customer_date IS NOT NULL 
      AND o.order_estimated_delivery_date IS NOT NULL

 

2017년 1월 한 달 동안 발생한 주문만 다뤄야 하고, 배송예정일과 실제 배송날짜가 null값일 경우 출력에서 제외하기 때문에 총 3개의 조건절을 걸어준다.