본문 바로가기

SQL/프로그래머스 SQL 고득점 kit

SQL 고득점 Kit / 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 - MySQL (WHERE절 서브쿼리)

728x90

📚문제

출처 : 프로그래머스(https://school.programmers.co.kr/learn/courses/30/lessons/157339)

 

📝풀이

나의 오답 코드

SELECT 
       C.CAR_ID
     , C.CAR_TYPE
     , ROUND(C.DAILY_FEE * 30 * (1-P.DISCOUNT_RATE*0.01)) AS FEE
FROM CAR_RENTAL_COMPANY_CAR C
INNER JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY H ON C.CAR_ID = H.CAR_ID
INNER JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN P ON C.CAR_TYPE = P.CAR_TYPE
WHERE (H.END_DATE <= '2022-10-31' OR H.START_DATE >= '2022-12-01')
  AND P.DURATION_TYPE = '30일 이상'
  AND C.CAR_TYPE IN ('세단','SUV')
GROUP BY C.CAR_ID
HAVING FEE>=500000 AND FEE<2000000
ORDER BY FEE DESC, C.CAR_TYPE, C.CAR_ID DESC

 

정답 코드

SELECT 
       C.CAR_ID
     , C.CAR_TYPE
     , ROUND(C.DAILY_FEE * 30 * (1-P.DISCOUNT_RATE*0.01)) AS FEE
FROM CAR_RENTAL_COMPANY_CAR C
INNER JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY H ON C.CAR_ID = H.CAR_ID
INNER JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN P ON C.CAR_TYPE = P.CAR_TYPE
WHERE C.CAR_ID NOT IN (
    SELECT CAR_ID
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
    WHERE END_DATE > '2022-11-01' AND START_DATE < '2022-12-01')
  AND P.DURATION_TYPE = '30일 이상'
  AND C.CAR_TYPE IN ('세단','SUV')
GROUP BY C.CAR_ID
HAVING FEE>=500000 AND FEE<2000000
ORDER BY FEE DESC, C.CAR_TYPE, C.CAR_ID DESC

 

두 코드의 차이점은 WHERE 구문 부분이다.

 

# 내 코드
WHERE (H.END_DATE <= '2022-10-31' OR H.START_DATE >= '2022-12-01')

# 정답 코드
WHERE C.CAR_ID NOT IN (
    SELECT CAR_ID
     FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
    WHERE END_DATE > '2022-11-01' AND START_DATE < '2022-12-01')

 

정답 코드를 보면

대여기간이 11월에 걸리는 경우 ( 대여기간이 하루라도 11월에 들어가 있는 모든 경우)를

AND 조건으로 묶어주었다

그리고 NOT IN 조건으로 CAR_ID가 해당기간에 포함되지 않는 

(이 기간에 대여된 적이 없는) 행을 조회한다

 

그리고 GROUP BY 하지 않고 

DISTINCT CAR_ID만 해줘도 된다

왜냐하면 

그룹화 해서 집계하려는 것이 아니라 

조건에 해당되는 자동차의 ID,타입과 FEE를 보려고 하는 것이기 때문이다

 

 

+

내 코드는 왜 안되는 것일까.. 조건은 만족하는 것 같은데 흠

우선 데이터리안 슬랙 채널에 질문 남겨놨으니까 

답변해주시면 참고해서 적어놔야겠다

WHERE H.END_DATE <= '2022-10-31' OR H.START_DATE >= '2022-12-01'

 

 

 

 

+

코딩을 조금 해보면서 느끼는 점은

알고 있는 함수와 코드의 양보다 

적재적소에 알고 있는 것을 잘 써먹는게 더 중요한 것 같다

 

WHERE절 서브쿼리는 SQL문제를 풀고 어깨너머로 구글링 해보면서 

어떤 느낌인지는 조금 익혔다

 

그래도 이렇게 한 번 생각이 나지 않으면 안 떠오르고

아 이걸 지금 쓰면 되겠구나 하는 감은 아직 부족한 것 같다

아직 기본기가 미흡하거나 문제풀이 경험과 스킬이 부족한거겠지?

늘 그러는 것처럼 자주 풀고 익숙해질 때까지 해보자

 

 

 

 

  

728x90