728x90
📚문제
📝풀이
나의 오답 코드
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
'SQL > 프로그래머스 SQL 고득점 kit' 카테고리의 다른 글
SQL 고득점 Kit / 상품을 구매한 회원 비율 구하기 / MySQL (0) | 2023.11.08 |
---|---|
SQL 고득점 Kit / 그룹별 조건에 맞는 식당 목록 출력하기 - MySQL (1) | 2023.11.03 |
SQL 고득점 Kit / 주문량이 많은 아이스크림들 조회하기 - MySQL (0) | 2023.11.02 |
SQL 고득점 Kit / 가격대 별 상품 개수 구하기 / MySQL (0) | 2023.10.31 |
SQL 고득점 Kit / 입양 시각 구하기(2) / MySQL (변수선언 , SELECT문 서브쿼리) (0) | 2023.10.31 |