본문 바로가기

데이터분석캠프 TIL

241216 TIL (SQL 코드카타 - 자동차 평균 대여기간 구하기, 우유와 요거트가 담긴 장바구니)

1. 자동차 평균 대여기간 구하기 

 

 

✅문제 풀이

SELECT CAR_ID, 
       ROUND(AVG(DATEDIFF(END_DATE, START_DATE) +1), 1) AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
HAVING AVG(DATEDIFF(END_DATE, START_DATE) + 1 ) >= 7
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC;

 

# 출력할 값: CAR_ID, AVERAGE_DURATION

평균 대여 기간이 7일 이상인 자동차들의 평균 대여 기간을 구하기 위해서는 두 날짜의 차이를 구해주는 함수인 DATEDIFF를 통해서 기간을 출력해야 한다. 

 

DATEDIFF( 'End_Date', 'Start_Date')을 하면 차이가 나오고, + 1을 해야 종료일과 시작일을 포함하는 값이 나온다. 

ROUND 함수를 가지고 소수점 두번째 자리에서 반올림한다. 

 

#GROUP BY를 통해서 CAR_ID로 묶어주고

#HAVING 절로 평균 대여 기간이 7일 이상인 값들만 출력한다. 

 


 

 

2. 우유와 요거트가 담긴 장바구니

 

 

✅문제풀이 

SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME IN ('Milk','Yogurt')
GROUP BY CART_ID
HAVING COUNT(DISTINCT NAME)=2
ORDER BY CART_ID

 

# 출력할 값: CART_ID

# 조건절에서 Name컬럼에 Milk, Yogurt가 포함된 항목을 찾는다. 

# GROUP BY 로 CART_ID를 묶어 준 후 

# HAVING 절을 통해 Milk와 Yogurt 두 개가 공통으로 구매한 사람을 찾는다. 

이 때 COUNT(DISTINCT)를 가지고 중복된 값은 제거해주어야 한다. 

 

 

✅다른 풀이 방법

WITH M AS (SELECT DISTINCT CART_ID, NAME
FROM CART_PRODUCTS
WHERE NAME = 'Milk')

, Y AS (SELECT DISTINCT CART_ID, NAME
FROM CART_PRODUCTS
WHERE NAME = 'Yogurt')

SELECT Y.CART_ID
FROM Y
INNER JOIN M
ON Y.CART_ID = M.CART_ID
ORDER BY Y.CART_ID

 

서브쿼리로 Milk와 Yogurt가 들어간 값들을 각각 찾아주고 JOIN으로 테이블을 합친다.